MySql中的like和in走不走索引
今天我们来实际操作一下
首先我们创建一个用户表进行测试
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 '%6@qq.com'
大家可以停下来想一下会不会走索引,注意我写的sql和数据库的数据。这条sql查询的目标数据在数据库中的区分度是没问题的,而且email字段也是有索引的,按理说这条语句肯定会走索引的。
我们来看下explain的分析结果
从结果来看是不走索引的,其实这跟mysql的索引组织结构有关系。
%加在前面mysql是无法使用索引查询的,因为mysql不知道%代表多少字符,所以就只能走全表扫描了。
第三种写法其实跟第二种写法是一样的,也属于%在前面的一种,同样也不会走索引。
In
in走不走索引这个和条件后面的数据量有关系,当数据量较小的时候是会走索引的,而当in后面跟的数据量较大的时候就会走全表扫描。mysql底层对于后面的条件很可能做了数据重复处理;参考别人博客解释道条件范围占总数据的30%左右的时候会进行全表扫描,放弃执行索引的方式;里面可能还涉及到对后面的数据去重之后的结果占比的判定!
详细的大家可以看下这篇博客,讲的还是很详细的。
MySQL的in条件走不走索引
MySql中的like和in走不走索引相关推荐
- 查询没有走索引_关于MySQL种的in函数到底走不走索引、我和同事差点大打出手!...
" 我是小羊同学,一个兢兢业业的程序员" 背景:有一天同事突然问我为什么加了in查询就突然变慢了.小羊脱口而出:"in不走索引!" 于是就炸开了锅:in不走索引 ...
- mysql in 索引_关于MySQL种的in函数到底走不走索引、我和同事差点大打出手!
" 我是小羊同学,一个兢兢业业的程序员" 背景:有一天同事突然问我为什么加了in查询就突然变慢了.小羊脱口而出:"in不走索引!" 于是就炸开了锅:in不走索引 ...
- MySQL的in条件走不走索引
答案是:看in后面跟的条件和扫描行的比例 目录 准备条件 鉴定过程 编写查询sql语句,查看执行计划: 这里吧in后面的数据范围变大: 这里测试把后面的条件: a.b换成 demo02.demo03 ...
- Mysql中主键和外键和索引
Mysql中主键和外键和索引 1.主键和外键是什么 学生表(学号,姓名,性别,班级) 其中每个学生的学号是唯一的,学号就是一个主键 课程表(课程编号,课程名,学分) 其中课程编号是唯一的,课程编号就是 ...
- MYSQL 中 OR 走不走索引
目录 添加a.b独立索引 添加a.b组合索引 新建表test01,字段:id.a.b.c 添加a.b独立索引 EXPLAIN SELECT * FROM test01 WHERE a = 1 OR b ...
- mysql的in走不走索引?
结论 mysql的in关键字不一定走索引. 个人猜测跟传入的元素个数和索引字段离散程度有关. 验证过程 -- mysql版本 select version(); -- 5.7.28-log-- 增加索 ...
- Mysql查询条件为大于时,不走索引失效问题排查
我们都知道在数据库查询时,索引可以极大的提高查询效率.通常在使用的时候,都会针对频繁查询的关键字段建立索引. 比如,当以交易日期(trans_date)来查询交易记录时,通常会对该字段添加索引,以便在 ...
- mysql中生成列与JSON类型的索引
MySQL中支持生成列,生成列的值是根据列定义中包含的表达式计算的. 一个简单的例子来认识生成列! CREATE TABLE triangle( sidea DOUBLE, sideb DOUBLE, ...
- MySQL中会用到age字段的索引_MySQL学习笔记(四):正确使用索引(二)
上一篇学习到了MySQL中的索引是什么,以及一些关于索引的简单的知识,这篇我打算详细地谈一谈如何正确地使用索引.索引的使用看起来很简单,但是在真正去学习它的时候才发现,原来是暗藏玄机.使用索引时有很多 ...
最新文章
- AI求解薛定谔方程,兼具准确度和计算效率,登上《自然-化学》
- (Matlab)从已知向量中随机提取若干元素
- 蓝桥杯2016省赛真题-剪邮票(dfs)
- dcdc芯片效率不高的原因_半导体厂商如何做芯片的出厂测试?
- CentOS 6.2 安装教程
- 无心剑英译朱自清《匆匆》
- 开启手机新时代,智领5G未来:中国电信首款5G定制高端机震撼登场
- php 删除字符前缀,thinkphp3.2.3如何删除同一前缀的缓存(File)
- win10系统如何查找字体库位置+在matplotlib散点图中的应用+散点图中显示不了中文
- c语言贪吃蛇积分用什么函数,C语言之贪吃蛇(curses库函数)
- Python_机器学习_常用科学计算库_第5章_Pandas
- appuim + python 实现 趣头条 自动阅读
- 深度学习MatConvNet安装
- 哲理故事三百篇[转]
- 太一硅谷实验室合伙人杨虎成:区块链草莽时代进入倒计时,马太效应开始显现...
- Gateway 出现Can not connect to tcp://127.0.0.1: Connection refused
- “Your Firefox profile cannot be loaded. It may be missing or inaccessible.“
- JAVA8 UnaryOperator接口
- vue项目怎么修改项目名称
- Android小练习2——制作点菜界面
热门文章
- android照片如何查看时间,【技巧】如何查看图片的拍摄地点和日期时间等信息...
- 【万人千题】结对编程排位赛(第一期) 第二周 排名公布,冠军成功卫冕,啊这……
- 今日金融词汇--- TO G 业务,是什么
- 今日金融词汇---基本面分析
- memset(G, 0x3f, sizeof(G))涵义
- 一道很水的题(南工校赛决赛第一题)
- 论文笔记-Domain Adaptation for Semantic Segmentation with Maximum Squares Loss
- android 电子书框架,[Android] Pdf开发框架使用
- excel向程序发送命令时出现错误
- java初始化二维数组的三种方式