联合索引最左前缀原则与索引失效场景
什么是联合索引的最左前缀原则(Leftmost Prefix Principle)?在什么情况下联合索引会失效?请举例说明常见的索引失效场景和如何避免。
回答
我是大山
最左前缀原则:
- 联合索引(a,b,c)实际创建了(a)、(a,b)、(a,b,c)三个索引
- 查询条件必须从最左列开始匹配,跳过某列会导致后续列索引失效
- 如:
WHERE a=1 AND c=3— a列走索引,c列无法使用索引(因为b列跳过了)
常见索引失效场景:
- 违反最左前缀:
WHERE b=2不走索引(跳过a列) - 隐式类型转换:
WHERE phone=123(phone为varchar),MySQL会将phone转数字导致索引失效 - LIKE以通配符开头:
WHERE name LIKE '%张'索引失效;'张%'有效 - 对索引列使用函数:
WHERE YEAR(create_time)=2024— 应改为范围查询 - OR条件:
WHERE a=1 OR b=2— 除非两边都有索引 - 索引列参与运算:
WHERE a+1=10— 应改为WHERE a=9 - MySQL优化器认为全表扫描比索引更快(数据量小时)