日期范围查询:tdate普通索引与(tdate, field1)覆盖索引性能对比
优先选择覆盖索引
(tdate, field1),性能提升更显著! 嘿,这个问题问到点子上了!咱们结合你的查询语句来具体分析两种索引的差异:
首先先提个小细节:你的查询里2016-6-07没加单引号,这会被MySQL当成数值运算(2016-6-7),导致日期类型不匹配,直接让索引失效,记得改成'2016-6-07'哦!
接下来对比两种索引的效果:
单字段索引
tdate
MySQL可以通过这个索引快速定位符合WHERE条件的行,但问题在于,索引里只存储了tdate的值,找到匹配的行之后,还得回到原表去读取field1的数据——这就是所谓的「回表查询」。如果符合条件的行数较多,回表的IO开销会拉低整体性能。覆盖索引
(tdate, field1)
这个索引包含了查询需要的所有字段:用来过滤的tdate,以及要返回的field1。MySQL只需要扫描这个索引就能直接得到结果,完全不需要回表操作。这种「索引覆盖查询」能大幅减少IO开销,尤其是当表数据量较大、符合条件的行数较多时,性能优势会非常明显。
额外补充一点:你的查询用了OR条件,但两个分支都是基于tdate的过滤,MySQL可以正常利用这两种索引,而覆盖索引因为不需要回表,效果会比单字段索引好得多。
如果你的表数据量很小,两种索引的差异可能不太明显,但从长期性能优化的角度来说,覆盖索引是更优的选择。
内容的提问来源于stack exchange,提问作者Yelt Forman
相关产品推荐
相关产品推荐

