mysql - 使用变量时慢的sql语句

标签 mysql sql performance variables mariadb

我对 MariaDB 10.1.26 运行了以下 SQL 语句,其中约 2.000 行具有即时结果。

select value, datetime from Schuppen 
where (value = (select min(value) from Schuppen where (measure = 'temp') 
    and datetime between '2018-11-01 00:00:00' and '2018-11-02 00:00:00')) 
and datetime between '2018-11-01 00:00:00' and '2018-11-02 00:00:00';

当我将以下语句与日期时间字段的变量一起使用时,执行时间约为 5.5 秒。

set @startdate = cast('2018-11-01 00:00:00' as datetime);
set @enddate = cast('2018-11-02 00:00:00' as datetime);
select value, datetime from Schuppen 
where (value = (select min(value) from Schuppen where (measure = 'temp') 
    and datetime between @startdate and @enddate)) 
and datetime between @startdate and @enddate;

我拥有的数据行越多,执行该语句所需的时间就越长。变量似乎以某种方式改变了语句的行为。

这里有什么问题吗?

最佳答案

我使用 MySQL Workbench,@variables 对于查询/搜索给定属性的不同表非常有用。我遇到了类似的问题。在搜索不同的线程并尝试不同的东西之后,当我将 @variable 设置为与我正在搜索的表中的列完全相同的类型相同的编码时,它运行良好那个变量。

例如:

SET @keyword = CONVERT(CAST("KEYWORD" AS CHAR(8)) USING ASCII);

在这种情况下,我的表 customer 中的搜索列 cname 是 CHAR(8) 类型并使用 ASCII 编码:

SELECT * FROM CUSTOMERS WHERE cname=@keyword;

如果你有多个表要查询,其中一个表的cname是CHAR(10),另一个表是CHAR(8),那么你可以这样做:

SET @keyword = "KEYWORD";
SELECT * FROM CUSTOMERS WHERE cname=CONVERT(CAST(@keyword AS CHAR(8)) USING ASCII);
SELECT * FROM EMPLOYEES WHERE cname=CONVERT(CAST(@keyword AS CHAR(10)) USING ASCII);

关于mysql - 使用变量时慢的sql语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53462728/

相关文章:

sql - 使用 LOOP 进行插入?

sql - 对于 SQL,如何使用 group by 两次但仅在第二组内按 sum() 排序

mysql - SQL - 在插入之前查找每个值的 ID

r - 向量中的嵌套滚动总和

php - 如何选择行数乘以非零列? (mysql)

java - 错误: subquery Returns more than one row

mysql - 与 SQL 行作斗争

包含文件上传和其他信息的 PHP 表单

c - 高效素数函数

c++ - 如何在需要时将C++中的计算推迟?