MySQL覆盖索引时允许索引执行LIKE操作吗?

  1. 问题描述: 学习<<高性能MySQL>>时, p172举例explain select * from products from actor = 'SEAN CARREY' and title like '%APOLLO%', 解释这里索引无法覆盖该查询的原因其中第二个是: MySQL不能在索引中执行LIKE操作. 但是我实际发现, 即使索引执行了LIKE也是可以覆盖索引的!
  2. 演示代码:

        -- 基于MySQL版本: 8.0.16
    
        -- 创建一个只有2个字段的表
        drop table if exists products;
        create table products (
            actor varchar(20),
            title varchar(20)
        );
    
        -- 创建覆盖所有字段的索引, 并未指定索引长度
        create index idx_actor_title on products (actor, title);
        
        -- 索引执行LIKE操作, 查看explain结果
        explain select * from products
        where actor = 'SEAN' and title like '%APOLLO%';
  3. 执行结果是: Extra是Using where; Using index, 所以说即使执行了LIKE也还是覆盖索引
  4. 请问是MySQL版本的问题吗, 还是我的理解有问题? 感谢!
阅读 3.2k
3 个回答

覆盖索引是因为表字段就2个,都被索引包含,但只用到了索引第一列actor,可以查看EXPLAINref字段,只有一个const

  1. 覆盖索引 采用b+ tree,上层是actor ,actor 子叶是 title,所以判断是采用了索引。
  2. like 是可以采用索引的,如果你用b+ tree,可以用 like 'AP%',这样规定字段开头是可以命中b+ bree,因为b+ tree 本来就是按照顺序存储。

ps: 并不是所有的like都是洪水猛兽!

是的,覆盖索引时(即select 后面字段都添加到索引里),使用like '%xxx%' 也是会走索引的,如果不是覆盖索引时,建议使用like 'xxx%'

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题