贝利信息

SQL查询为什么全表扫描_索引失效原因总结【教学】

日期:2025-12-25 00:00 / 作者:舞夢輝影
SQL查询全表扫描主因是查询条件未有效触发索引使用。1.对索引列用函数或运算(如YEAR(create_time)=2025);2.LIKE以%开头(如name LIKE '%明');3.隐式类型转换(如VARCHAR字段传数字);4.联合索引未遵循最左前缀原则(如索引(a,b,c)只查b,c)。

SQL查询出现全表扫描,通常是因为数据库优化器没走索引,转而逐行读取整张表——性能会随数据量增长急剧下降。核心问题不在于“有没有建索引”,而在于“查询条件能否有效触发索引的使用”。下面从常见场景出发,说清楚索引为啥失效、怎么避免。

WHERE条件中对索引列做了函数或运算

数据库无法直接用索引定位值,必须先计算每行结果再比对,索引自然被跳过。

模糊查询时LIKE以通配符开头

B+树索引按字典序存储,前缀匹配可快速定位,但%abc这种没有固定前缀,只能全扫。

隐式类型转换导致索引失效

字段是字符串类型,但查询时传了数字;或字段是INT,却用字符串比较——MySQL会自动转换,但索引列被“加工”了,无法命中。

联合索引未遵循最左前缀原则

联合索引 (a, b, c) 实际上只对 a(a,b)(a,b,c) 三种组合高效;跳过左边列(比如只查 bb,c),索引就用不上。

索引不是建了就生效,关键看查询写法是否与索引结构“对得上”。多用 EXPLAIN 验证执行计划,比死记规则更可靠。不复杂但容易忽略。