一篇文章了解Like用法及常见索引失效情况

2023-05-16

1.简介

本文主要通过介绍Like索引及常见索引失效情况,以MySQL为例。

2.EXPLAIN关键字

一条查询语句在经过MySQL查询优化器的各种基于成本和规则的优化会后生成一个所谓的执行计划。

EXPLAIN 语句 就可以看到某个查询数据的执行计划,以下是执行计划的各个参数:
在这里插入图片描述
语句使用:

EXPLAIN select * from user

3.Like索引失效情况

1. 使用 3%进行查询索引不会失效

explain SELECT * from tb_user where page like ‘3%’

在这里插入图片描述
可以看到可以使用的索引是page,实际使用索引page。

2. 使用 %3进行查询索引会失效

explain SELECT * from tb_user where page like ‘%3’

在这里插入图片描述
使用%3查询走的是全表扫描,并没有用到page索引。

解决办法
1.创建倒叙索引,reverse()

reverse()应用场景,比如你根据身份证查询一个市洲的人员信息。众所周知,同一个市洲大部分人员身份证前6位是相同的,比如黄石,前六位420222。这个时候你就可以通过reverse()字段,创建身份证后6位的前缀索引进行查询。

CREATE INDEX pagereverse ON tb_user (reverse(page ));

2.修改SQL语句

select page from tb_user where reverse(page ) like reverse(‘%3’);

在这里插入图片描述
没有进行全表扫描,使用并走了pagereverse 索引

3. 使用%3% 进行查询索引会失效

1. like concat(‘%’, ‘3’, ‘%’)

explain SELECT * from tb_user where page like concat(‘%’, ‘3’, ‘%’)

索引失效,未走索引
在这里插入图片描述
50w数据查询,耗时0.410s在这里插入图片描述

2.使用LOCATE函数

explain SELECT * from tb_user where LOCATE(‘3’, page)>0

索引失效,未走索引
在这里插入图片描述50w数据查询,耗时0.403s
在这里插入图片描述
3.使用POSITION函数

explain SELECT * from tb_user where POSITION(‘3’ in page)>0

索引失效,未走索引
在这里插入图片描述

50w数据查询,耗时0.406s
在这里插入图片描述
4.使用INSTR函数

explain SELECT * from tb_user where INSTR(page,‘3’)>0

索引失效,未走索引
在这里插入图片描述
50w数据查询,耗时0.411s
在这里插入图片描述

个人觉得前期如果数据量不大,其实是可以用like的。毕竟其实在少量数据的情况下他们的查询效率都差不多。目前还没有测试过千万数据或者亿及数据他们的效率是怎样。

5.常见索引失效情况

1、使用like后面紧跟着%,如’%3’

explain SELECT * from tb_user where page like concat(‘%’, ‘3’,‘%’)

在这里插入图片描述
2、查询数据占总数据 30% 则MYSQL不会再使用索引。因为使用索引的开销反而更大。

SELECT count(*) from tb_user_copy1

总条数: 416853
在这里插入图片描述

explain SELECT * FROM tb_user_copy1 where age between 1 and 3

rows预计扫描行数96168,占比百分之23 走索引

在这里插入图片描述

explain SELECT * FROM tb_user_copy1 where age between 1 and 4

rows预计扫描行数超过百分之30 ,未走索引
在这里插入图片描述
也可以使用 force index(age) 让MySQL强行使用索引查询

explain SELECT * FROM tb_user_copy1 force index(age) where age BETWEEN 1 and 4

在这里插入图片描述

3、不满足最左匹配原则
建立了一个name,age联合索引
在这里插入图片描述

explain SELECT * FROM tb_user_copy1 where age =4

未走索引,全表扫描
在这里插入图片描述

explain SELECT * FROM tb_user_copy1 where name LIKE ‘w%’ and age =4

走了联合索引
在这里插入图片描述

4、字符串不加单引号索引会失效

explain SELECT * FROM tb_user_copy1 where name=123

未走索引,全表扫描
在这里插入图片描述

5、mysql使用不等于(!= 或者<>)的时候,无法使用索引,会导致索引失效

explain SELECT * FROM tb_user_copy1 where age >=5

全表扫描,未使用索引
在这里插入图片描述
6.where 子句里对有索引列使用函数,用不上索引

explain SELECT * FROM tb_user_copy1 where ABS(age) =5

全表扫描,未使用索引
在这里插入图片描述
7.where中索引列有运算

explain SELECT * FROM tb_user_copy1 where age *2 =10

全表扫描,未使用索引
在这里插入图片描述

8、is null可以走索引,is not null无法使用索引

explain SELECT * FROM tb_user_copy1 where name is null

is null走了索引
在这里插入图片描述

explain SELECT * FROM tb_user_copy1 where name is not null

is not null 未走索引
在这里插入图片描述

9、条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)。要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引

explain SELECT * FROM tb_user_copy1 where name = “G1” or age =8

只有一个age索引情况,未走索引
在这里插入图片描述age和name索引都有,走了索引
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一篇文章了解Like用法及常见索引失效情况 的相关文章

随机推荐

  • Java实现二分搜索

    二分查找 xff1a 是一种算法 xff0c 其输入是一个有序的元素列表 xff08 必须是有序的 xff09 xff0c 如果查找的元素包含在列表中 xff0c 返回其索引 xff0c 否则返回负数 比如说有一个1 100的数字 xff0
  • Python if else条件语句你懂了吗?

    在 Python 中 xff0c 可以使用 if else 语句对条件进行判断 xff0c 然后根据不同的结果执行不同的代码 xff0c 这称为选择结构或者分支结构 Python 中的 if else 语句可以细分为三种形式 xff0c 分
  • 嵌入式学习系统里的ROM和RAM(转载)

    一个嵌入式项目在立项时 xff0c 其中有个重要的环节就是对系统所需的RAM和ROM用量进行评估 xff0c 在满足系统需求的前提下 xff0c 尽量降低硬件成本 xff0c 据说同等大小的RAM价格大概是ROM的6倍 大部分的资料都宣称程
  • 关于Mysql8.0.22服务无法启动问题

    关于Mysql8 0 22服务无法启动问题 1 官网下载 解压完成后 不存在data文件夹 也不要自己创建 后面会用命令生成 请往后看 2 创建my ini文件 xff08 一定要放在bin目录下 xff0c 不要放在mysql8 0 22
  • 查找Ubuntu中安装软件的位置

    查找Ubuntu中安装软件的位置 下面仅自我学习记录只做参考 xff0c 不可全信 通常使用ps e 找到软件的具体名字 xff0c 然后进行位置查找 自我记录 1 执行程序查看 对于有的程序没有效果 type 软件名 2 通过进程查看 p
  • Python爬虫:第三章 数据解析 xpath解析(12)

    第三章 数据解析 xpath 解析xpath 解析基础example1 爬取58二手房中的房源信息example2 解析下载图片数据example3 全国城市名称爬取 xpath 解析 xpath 解析基础 span class token
  • java获取项目文件绝对路径

    该方法是先根据指定目录创建文件目录后 xff0c 再获取起绝对路径 xff0c 可先在指定目录中放入指定文件 xff0c 这样就可以直接获取起绝对路径 span class token keyword public span span cl
  • 三分钟带你了解最成熟最流行的LAMP网站应用架构

    三分钟带你了解最成熟最流行的LAMP网站应用架构 一 LAMP概述1 各组件的主要作用2 各组件安装顺序 二 编译安装Apache httpd服务准备工作1 关闭防火墙 xff0c 将安装Apache所需软件包传到 opt目录下2 安装环境
  • IDEA通过maven配置Spring保姆级教程

    写在前面 xff1a 此篇文章主要是记录IDEA利用maven配置Spring的全过程 由于本人也是慢慢探索出来的 xff0c 所以有不全或者遗漏的地方 xff0c 还请大家斧正 请耐心看完文章 xff0c 前期工作做完后IDEA才可以配置
  • 策略梯度算法(Policy Gradient)逐行代码详解

    理论部分以及完整代码参看之前的博客 xff1a https blog csdn net qq 47997583 article details 124506650 本文章介绍的是策略梯度算法中的REINFORCE实现 上图为算法流程图 xf
  • python爬虫(自动下载图片)

    爬虫第一步下载第三方工具 requests包 win 43 R 输入cmd点击确定或回车 输入以下命令下载requests包 requests包是python爬虫常用的包 他的下载方式是 pip install requsts 如果觉得下载
  • python json格式转字典

    impor json req 61 json loads 转换的内容
  • mysql安装5.7出现闪退解决办法

    MySQL下载官网 下载地址 xff1a https dev mysql com downloads mysql 我之前用的是5 5的版本升级到5 7是将所有的数据生成到文件里 命令 mysqldump u root p all datab
  • 小程序设置、获取本都缓存、发送请求、渲染数据、转发当前页面、下拉刷新页面

    设置 获取缓存 xff0c 发送请求 xff0c 渲染数据 xff0c 转发当前页面 设置 获取本地缓存设置本地缓存 xff08 wx setStorage xff09 获取本地缓存 xff08 wx getStorageSync xff0
  • cnpm安装步骤

    安装nodeJS 官网下载 xff1a http nodejs cn download 选择其他版本下载地址 https nodejs org zh cn download releases 选版本点击下载 然后下载后缀名为msi 因为安装
  • likeadmin权限管理菜单报错:AxiosError

    报错图片 xff1a 这个原因是后端返回的 JSON 数据太多而导致前端报错 xff0c 可能是因为前端无法处理大量数据 下面是一些可能导致前端代码处理大量数据出现问题 返回json数据中的末尾有说到数据太多了的原因 然后我去数据库的sys
  • Vue安装

    Vue安装 一 安装二 使用步骤1 在项目中使用vue2 使用命令创建vue项目 一 安装 安装vue之前需要安装nodeJS 1 需要安装Node js 可以从官方网站进行下载并安装 2 这篇博客有详细的步骤 Node js安装详解 3
  • Thinkphp6模型关联

    文章目录 前言一 一对一关联示例 二 一对多三 多对多四 示例总结hasManybelongsTohasOne 前言 ThinkPHP 6 模型关联是指使用 PHP 对象关系映射 xff08 ORM xff09 机制 xff0c 通过模型类
  • Linux----生产者与消费者

    生产者与消费者 模型场景分析 xff1a 编程流程 xff1a 生产者同步流程消费者同步流程 代码实现主函数生产者线程函数消费者线程函数 模型场景 分析 xff1a 缓冲区buff中存放数据 生产者和消费者数目不固定 xff0c 生产者向缓
  • 一篇文章了解Like用法及常见索引失效情况

    1 简介 本文主要通过介绍Like索引及常见索引失效情况 xff0c 以MySQL为例 2 EXPLAIN关键字 一条查询语句在经过MySQL查询优化器的各种基于成本和规则的优化会后生成一个所谓的执行计划 EXPLAIN 语句 就可以看到某