一句话总结
在 SELECT IN查询中,索引可以通过将IN列表中的值与索引列进行匹配来加速查询。对于模糊查询,使用索引的效果取决于查询模式:如果使用前缀匹配(如LIKE 'abc%'),索引可以有效加速查询;但如果使用通配符开头(如LIKE '%abc'),索引通常无法使用,因为需要扫描整个表。优化模糊查询时,可以考虑使用全文索引或重构查询条件以提高性能。
详细解析
1.SELECT IN如何使用索引?
- 场景示例:
SELECT * FROM users WHERE age IN (20, 25, 30);
- 索引生效条件:单字段索引:若age有索引,数据库会将IN转换为多个OR条件(age=20 OR age=25 OR age=30),直接命中索引。组合索引:若查询包含多列(如WHERE age IN (20,30) AND city='北京'),需创建(city, age)组合索引(范围字段放最后)。
- 索引失效陷阱:IN列表过长(如超过1000项):优化器可能放弃索引,选择全表扫描。NULL值:WHERE age IN (20, NULL)会导致索引失效(NULL需特殊处理)。
2.模糊查询如何使用索引?
- 场景示例:
SELECT * FROM products WHERE name LIKE 'Apple%'; -- 命中索引
SELECT * FROM products WHERE name LIKE '%Phone'; -- 索引失效
索引生效条件:
- 前缀匹配('text%'):索引按字典序存储,'Apple%'可快速定位到'Apple Watch'、'Apple Pen'等前缀匹配项。
- 后缀匹配优化:若需'%Phone',可反转字符串并建索引:
ALTER TABLE products ADD INDEX idx_name_reverse (reverse(name));
SELECT * FROM products WHERE reverse(name) LIKE reverse('%Phone');
- 索引失效场景:LIKE '%xxx%':索引无法定位起始位置,如同乱序字典中找所有含“书”的字(需逐页翻查)。通配符开头 + 长字符串:LIKE '%abcdefghijk%'即使有索引也全表扫描。
关键难点:为什么模糊查询必须前缀匹配?
解释:索引像字典目录
- 前缀匹配'A%' → 查字典时按拼音首字母找“A开头的字”(目录直接定位)。
- 后缀匹配'%A' → 需翻遍整本字典检查每个字是否以“A”结尾(全表扫描)。
- 全模糊'%A%' → 需检查每个字是否包含“A”(类似全文检索,普通索引无效)。