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

发布于 2022-09-11 21:48:24 字数 811 浏览 11 评论 0

  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版本的问题吗, 还是我的理解有问题? 感谢!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

苄①跕圉湢 2022-09-18 21:48:24

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

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

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

尤怨 2022-09-18 21:48:24

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文