10.16
建了索引不代表一定用得上,下面这8种情况索引会失效,我踩过一半。
-
对索引列做运算:where id + 1 = 5,改成where id = 4。
-
对索引列用函数:where year(create_time) = 2024,改成范围查询。
-
隐式类型转换:字段是varchar,传了数字,MySQL会转成double比较,索引失效。
-
like以%开头:like '%abc'失效,like 'abc%'有效。
-
联合索引不满足最左前缀:索引(a,b,c),查b=1用不上,查a=1 and c=1只能用到a。
-
or连接非索引列:where a=1 or b=2,b没索引,整体失效。
-
使用!=或<>:优化器可能判断全表扫描更快。
-
数据量少或区分度低:性别字段只有男女,建索引也没意义。
排查方法:explain看type和key。type是ALL就是全表扫,ref和range算正常。养成写完SQL用explain看一眼的习惯,比事后优化省事。
浙公网安备 33010602011771号