我有一个针对带有〜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;
我拥有的数据行越多,执行该语句所花费的时间就越长。似乎变量会以某种方式更改语句的行为。
这是怎么了?
答案 0 :(得分:3)
问题是查询优化器在使用变量时在寻找合适的索引方面做得不好。这是一个已知问题。
如果您在两个查询上都使用EXPLAIN
,则会看到不同之处。只是在不必要时尽量避免使用变量。
对于第一个查询,优化器“看到”所选值并确定可以完美地使用索引来更有效地满足所选范围。
对于第二个查询,优化器不知道定义范围的两个值,而是决定退回到完全扫描。