开篇:明明建了索引,为什么还是全表扫描?
你信心满满地给查询字段加上了索引,EXPLAIN 一看——type = ALL,全表扫描。索引白建了?
这种情况比想象中常见。索引不是建了就一定会用,最终决定"用不用索引、用哪个索引"的是 MySQL 的优化器。优化器基于成本预估来做选择——它不看语义,不看你的意图,只看哪种方案的 I/O + CPU 成本最低。
理解索引失效的各种场景,是写出高性能 SQL 的必修课。
一、索引失效的十大场景
大约 13 分钟
你信心满满地给查询字段加上了索引,EXPLAIN 一看——type = ALL,全表扫描。索引白建了?
这种情况比想象中常见。索引不是建了就一定会用,最终决定"用不用索引、用哪个索引"的是 MySQL 的优化器。优化器基于成本预估来做选择——它不看语义,不看你的意图,只看哪种方案的 I/O + CPU 成本最低。
理解索引失效的各种场景,是写出高性能 SQL 的必修课。
想象一下这个场景:周五下午五点,你的电商系统突然变慢。订单页面转了十几秒才打开,客服消息炸了群。运维一看监控------数据库连接池全满,几百个线程都在排队等着。
最后查出原因:一条没加索引的查询语句,平均执行要 3 秒。高峰期每秒来 50 个请求,数据库连接根本不够用。
这就是慢查询的可怕之处。它就像高速公路上的一起追尾事故------事故本身可能只涉及一辆车,但它把整条车道堵住了,后面几公里的车全走不了。一条慢 SQL 占着连接不释放,后面的请求只能排队,连接池被耗尽,所有查询都受影响。