首页 > 解决方案 > 使用变量时sql语句慢

问题描述

我在 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;

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

这里有什么问题?

标签: mysqlsqlperformancevariablesmariadb

解决方案


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

如果您EXPLAIN对这两个查询都使用,您将看到不同之处。只是在不必要的时候尽量避免变量。

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

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


推荐阅读