You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL WHERE查询性能差异疑问:两种条件为何扫描行数差异巨大?

MySQL查询性能差异原因解析

核心逻辑:索引是否能被有效利用

两个查询的性能差异本质是索引是否可用,这和MySQL的B-tree索引运行机制直接相关:

第一个查询:高效利用索引

查询语句:

EXPLAIN SELECT * FROM sensor WHERE fecha >= '2022-07-16 10:00:00';
  • 这个查询直接对fecha字段做范围比较,没有对字段做任何函数转换。MySQL的B-tree索引是按字段原始值有序存储的,因此可以快速定位到fecha大于等于'2022-07-16 10:00:00'的起始位置,然后只扫描后续匹配的32行数据,无需遍历全表。

第二个查询:索引失效导致全表扫描

查询语句:

EXPLAIN SELECT * FROM sensor WHERE DATE(fecha) = '2022-07-16' AND HOUR(fecha) >= '10:00:00';
  • 这里对fecha字段使用了DATE()和HOUR()函数,属于对索引字段进行函数运算。这种情况下,MySQL无法直接利用fecha上的索引——因为函数运算会改变字段原本的有序性,索引里存储的是原始时间值,而非函数计算后的结果。
  • MySQL只能对全表的95084条数据逐一计算DATE(fecha)和HOUR(fecha)的结果,再和条件对比,因此扫描行数等于总数据量,性能大幅下降。

优化建议

如果要实现第二个查询的逻辑且保持高效,需要把条件改写成不使用函数的形式,让索引能正常发挥作用:

EXPLAIN SELECT * FROM sensor WHERE fecha >= '2022-07-16 10:00:00' AND fecha < '2022-07-17 00:00:00';

内容的提问来源于stack exchange,提问作者pepqq

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 21:15:36