MySQL极小表是否忽略索引?关联查询未用索引原因咨询
MySQL极小表索引忽略问题及查询未用索引原因解析
嘿,这个场景我之前排查过,咱们一步步来拆解你的问题:
一、MySQL极小表是否会忽略索引?
答案是会的,这是MySQL查询优化器基于「成本计算」做出的合理选择。
MySQL的优化器会对比「全表扫描」和「使用索引查询」的成本,然后选成本更低的执行方式:
- 对于极小表(比如你的abc表只有3行),全表扫描只需要读取少量的数据页,几乎没有额外开销;
- 而使用索引的话,需要先读取索引页找到对应的数据位置,再回表读取数据行,反而会多了索引IO的开销,成本更高。
所以优化器会主动忽略索引,选择全表扫描,这是正常的优化行为,不是索引失效或者配置问题。
二、你的查询未使用索引的具体原因
结合你的查询语句SELECT abc.* FROM abc WHERE abc.id NOT IN ( SELECT DISTINCT abc_id FROM zyx WHERE id = 12345 );,核心原因有两个:
1. abc表数据量极小,全表扫描成本远低于索引查询
正如上面所说,3行数据的全表扫描几乎是瞬间完成的,优化器计算后会直接选择全表扫描,完全没必要走索引,所以EXPLAIN结果里的key和possible_keys都不会显示索引。
2. NOT IN子查询的结构放大了全表扫描的性价比
虽然你的子查询是从大表zyx中获取数据,但abc表本身太小,即使把子查询的结果拿到后,全表遍历3行数据去匹配「NOT IN」的条件,也比走索引再匹配要快得多。优化器很清楚这一点,所以不会触发索引的使用。
验证小技巧
如果你想验证索引本身是有效的,可以尝试强制使用索引:
SELECT abc.* FROM abc FORCE INDEX (idx_id) WHERE abc.id NOT IN ( SELECT DISTINCT abc_id FROM zyx WHERE id = 12345 );
执行EXPLAIN后会看到索引被使用,但实际执行速度大概率不如原查询,这也能侧面说明优化器的选择是合理的。
内容的提问来源于stack exchange,提问作者123
相关产品推荐
相关产品推荐

