mysql - 使用变量时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;
我拥有的数据行越多,执行语句所需的时间就越长。似乎变量以某种方式改变了语句的行为。
这里有什么问题?
解决方案
问题是查询优化器在使用变量时在寻找合适的索引方面做得不好。这是一个已知的问题。
如果您EXPLAIN
对这两个查询都使用,您将看到不同之处。只是在不必要的时候尽量避免变量。
对于第一个查询,优化器“看到”选择的值并决定可以完美地使用索引来更有效地满足所选范围。
对于第二个查询,优化器不知道定义范围的两个值,而是决定退回到 FULL SCAN。
推荐阅读
- python - 根据每个单独数据帧的行索引(数量)连接/加入/合并多个数据帧
- asp.net-mvc - IsUserInRole 不在我的 CustomRoleProvider 中执行
- java - 如何杀死由 3rd 方库设计的应用程序中的所有线程
- google-cloud-platform - 谷歌数据流模板
- mysql - SQL IN 查询性能 - 是否更好地拆分它
- windows - 操作系统中的事件如何
- android - Android Dagger2 问题。找到多个 Retrofit 注释,只允许一个
- javascript - React Router redirect after submitting a form using the input value
- php - 从具有特定开始日期的随机顺序对天数数组进行排序
- ssl - SSL 终止后本地 kubernetes 后端服务地址的 HTTPS 端点