MySQL开启log_queries_not_using_indexes后,查询含主键的countries表被记录的疑问
MySQL开启log_queries_not_using_indexes后,查询含主键的countries表被记录的疑问
嗨,我来帮你拆解这个问题,其实这是MySQL优化器的正常行为,不用太担心~
为什么明明有主键,查询却没走索引?
你看你的countries表只有63行数据,数据量极小。MySQL的优化器会对比“全表扫描”和“走索引”的成本:对于小表来说,全表扫描的IO开销反而比遍历聚簇索引(主键索引)更低,所以优化器主动选择了全表扫描(也就是EXPLAIN里的type=ALL,key=NULL),这完全是合理的优化决策,不是表结构或者查询的问题。
为什么这个查询会被log_queries_not_using_indexes记录?
这个日志的规则很直白:只要查询没有使用任何索引,就会被记录下来——不管你的表有没有定义索引。这里优化器选了全表扫描,确实没用到任何索引,所以符合记录条件,自然就出现在日志里了。
应该忽略还是处理?
这种情况完全可以忽略:
- 当未来你的
countries表数据量增长到一定规模(比如几千行以上),优化器会自动切换为使用主键索引,那时这个查询就不会被记录了。 - 如果非要强制现在就走索引,可以给查询加
FORCE INDEX(PRIMARY),比如:
但真的没必要,小表全表扫描的效率反而更高。SELECT id, country AS country_name FROM countries FORCE INDEX(`PRIMARY`);
备注:内容来源于stack exchange,提问作者john
相关产品推荐
相关产品推荐

