四时宝库

程序员的知识宝库

在 SELECT IN / 模糊查询中如何使用索引

一句话总结

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”(类似全文检索,普通索引无效)。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接