当前位置:网站首页>MySql中的like和in走不走索引
MySql中的like和in走不走索引
2022-08-02 02:57:00 【emgexgb_sef】
今天我们来实际操作一下
首先我们创建一个用户表进行测试
Like
在email字段上加一个索引来测试Like关键字
我们先来复习一下Like语句的几种写法
往大的方向说Like语句由两种写法,分别时%和_。
%:用来匹配若干个字符的出现形式(也可以是0个)
_:用来匹配单个字符的出现形式
工作中我们主要的模糊查询也是%,我们重点来看一个Like的几种写法
select * from t_user where email like ‘你所知道的字符%’
select * from t_user where email like ‘%你所知道的字符’
select * from t_user where email like ‘%你所知道的字符%’
我们分别来看一下这三种走索引的情况
先来看第一种写法select * from t_user where email like ‘你所知道的字符%’
使用explain分析一下
很明显这条语句是走索引的。
这里有没有问题呢?我们把数据库中的数据做一下修改这行语句还会走索引吗?
我们将数据都修改为重复的,降低索引的区分度再试试。
再通过explain分析一下看结果
通过type列的ALL很明显看出这条语句已经不走索引了,因为此时数据库中email字段的区分度已经不支持123% 这种写法走索引了,所以使用的全表扫描。
接着来看第二种写法
select * from t_user where email like '%你所知道的字符'
先看测试数据
我们执行一下这行sql
SELECT * from t_user where email LIKE '%[email protected]'
大家可以停下来想一下会不会走索引,注意我写的sql和数据库的数据。这条sql查询的目标数据在数据库中的区分度是没问题的,而且email字段也是有索引的,按理说这条语句肯定会走索引的。
我们来看下explain的分析结果
从结果来看是不走索引的,其实这跟mysql的索引组织结构有关系。
%加在前面mysql是无法使用索引查询的,因为mysql不知道%代表多少字符,所以就只能走全表扫描了。
第三种写法其实跟第二种写法是一样的,也属于%在前面的一种,同样也不会走索引。
In
in走不走索引这个和条件后面的数据量有关系,当数据量较小的时候是会走索引的,而当in后面跟的数据量较大的时候就会走全表扫描。mysql底层对于后面的条件很可能做了数据重复处理;参考别人博客解释道条件范围占总数据的30%左右的时候会进行全表扫描,放弃执行索引的方式;里面可能还涉及到对后面的数据去重之后的结果占比的判定!
详细的大家可以看下这篇博客,讲的还是很详细的。
先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦
边栏推荐
- PyTorch(六)——PyTorch可视化
- JS中获取对象数据类型的键值对的键与值
- 7-43 字符串关键字的散列映射 (25 分) 谜之测试点
- Curriculum Vitae;CV
- MySQL8 -- use msi (graphical user interface) under Windows installation method
- analog IC layout-Environmental noise
- 【LeetCode】20. Valid parentheses
- Invalid bound statement (not found)出现的原因和解决方法
- MySQL index optimization in practice
- AcWing 1285. Word Problem Solving (AC Automata)
猜你喜欢

MySQL8 -- use msi (graphical user interface) under Windows installation method

7、MySQL Workbench 导出导入数据库

PHP WebShell Free Kill

【每日一道LeetCode】——1. 两数之和

"Paid paddling" stealthily brushes Brother Ali's face scriptures, challenges bytes three times, and finally achieves positive results

指针数组和数组指针

svm.SVC应用实践1--乳腺癌检测

Navicat cannot connect to database Mysql because of WiFi

Flask入门学习教程

忽晴忽雨
随机推荐
Flask入门学习教程
架构:微服务网关(SIA-Gateway)简介
Hit the programmer interview scene: What did Baidu interviewers ask me?
mysql使用on duplicate key update批量更新数据
Nacos source code analysis topic (2) - service registration
消息队列经典十连问
总体写作原则
【LeetCode】145.二叉树的后序遍历
MySQL8--Windows下使用msi(图形界面)安装的方法
第一章——线性表(顺序表和链表)
详解最强分布式锁工具:Redisson
7、MySQL Workbench 导出导入数据库
【LeetCode】144. Preorder Traversal of Binary Tree
微服务:微智能在软件系统的简述
Go语学习笔记 - gorm使用 - 事务操作 Web框架Gin(十一)
PHP WebShell Free Kill
MySQL index optimization in practice
aws s3上传文件
01-Node-Express系统框架搭建(express-generator)
Curriculum Vitae;CV