使用变量时的慢SQL语句

时间:2018-11-24 22:00:29

标签: mysql sql performance variables mariadb

我有一个针对带有〜2.000行的MariaDB 10.1.26的以下SQL语句,具有即时结果。

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';

当我在datetime字段中使用带有变量的以下语句时,执行过程需要约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;

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

这是怎么了?

1 个答案:

答案 0 :(得分:3)

问题是查询优化器在使用变量时在寻找合适的索引方面做得不好。这是一个已知问题。

如果您在两个查询上都使用EXPLAIN,则会看到不同之处。只是在不必要时尽量避免使用变量。

对于第一个查询,优化器“看到”所选值并确定可以完美地使用索引来更有效地满足所选范围。

对于第二个查询,优化器不知道定义范围的两个值,而是决定退回到完全扫描。