• MySql中的like和in走不走索引


    今天我们来实际操作一下
    首先我们创建一个用户表进行测试

    Like
    在这里插入图片描述
    在email字段上加一个索引来测试Like关键字
    在这里插入图片描述
    我们先来复习一下Like语句的几种写法
    往大的方向说Like语句由两种写法,分别时%和_。
    %:用来匹配若干个字符的出现形式(也可以是0个)
    _:用来匹配单个字符的出现形式
    工作中我们主要的模糊查询也是%,我们重点来看一个Like的几种写法

    1. select * from t_user where email like ‘你所知道的字符%’
    2. select * from t_user where email like ‘%你所知道的字符’
    3. select * from t_user where email like ‘%你所知道的字符%’
      我们分别来看一下这三种走索引的情况
      先来看第一种写法
    select * from t_user where email like '你所知道的字符%'
    
    • 1

    使用explain分析一下
    在这里插入图片描述
    很明显这条语句是走索引的。
    这里有没有问题呢?我们把数据库中的数据做一下修改这行语句还会走索引吗?
    我们将数据都修改为重复的,降低索引的区分度再试试。
    在这里插入图片描述
    再通过explain分析一下看结果
    在这里插入图片描述
    通过type列的ALL很明显看出这条语句已经不走索引了,因为此时数据库中email字段的区分度已经不支持123% 这种写法走索引了,所以使用的全表扫描。

    接着来看第二种写法

    select * from t_user where email like '%你所知道的字符'
    
    • 1

    先看测试数据
    在这里插入图片描述
    我们执行一下这行sql

    SELECT * from t_user where email LIKE '%6@qq.com'
    
    • 1

    大家可以停下来想一下会不会走索引,注意我写的sql和数据库的数据。这条sql查询的目标数据在数据库中的区分度是没问题的,而且email字段也是有索引的,按理说这条语句肯定会走索引的。
    我们来看下explain的分析结果
    在这里插入图片描述
    从结果来看是不走索引的,其实这跟mysql的索引组织结构有关系。
    %加在前面mysql是无法使用索引查询的,因为mysql不知道%代表多少字符,所以就只能走全表扫描了。

    第三种写法其实跟第二种写法是一样的,也属于%在前面的一种,同样也不会走索引。

    In
    in走不走索引这个和条件后面的数据量有关系,当数据量较小的时候是会走索引的,而当in后面跟的数据量较大的时候就会走全表扫描。mysql底层对于后面的条件很可能做了数据重复处理;参考别人博客解释道条件范围占总数据的30%左右的时候会进行全表扫描,放弃执行索引的方式;里面可能还涉及到对后面的数据去重之后的结果占比的判定!

    详细的大家可以看下这篇博客,讲的还是很详细的。

    MySQL的in条件走不走索引

  • 相关阅读:
    PCIe实用调试工具MindShare Arbor增加试用天数
    HAL_UART_Receive不能正常超时返回
    GB-T 43698-2024 网络安全技术 软件供应链安全要求
    提升企业人效,从精细化考勤管理开始
    html入门综合练习
    CobalStrike(CS)流量分析
    FastAPI 学习之路(三十一)CORS(跨域资源共享)
    模拟器安装magisk
    我们来聊聊锁升级吧
    重点:测试与开发中要考虑的安全问题,那些年我们曾经犯过的错......
  • 原文地址:https://blog.csdn.net/weixin_45743816/article/details/125498105