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

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 '你所知道的字符%'

使用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走不走索引相关推荐

  1. 查询没有走索引_关于MySQL种的in函数到底走不走索引、我和同事差点大打出手!...

    " 我是小羊同学,一个兢兢业业的程序员" 背景:有一天同事突然问我为什么加了in查询就突然变慢了.小羊脱口而出:"in不走索引!" 于是就炸开了锅:in不走索引 ...

  2. mysql in 索引_关于MySQL种的in函数到底走不走索引、我和同事差点大打出手!

    " 我是小羊同学,一个兢兢业业的程序员" 背景:有一天同事突然问我为什么加了in查询就突然变慢了.小羊脱口而出:"in不走索引!" 于是就炸开了锅:in不走索引 ...

  3. MySQL的in条件走不走索引

    答案是:看in后面跟的条件和扫描行的比例 目录 准备条件 鉴定过程 编写查询sql语句,查看执行计划: 这里吧in后面的数据范围变大: 这里测试把后面的条件: a.b换成 demo02.demo03 ...

  4. Mysql中主键和外键和索引

    Mysql中主键和外键和索引 1.主键和外键是什么 学生表(学号,姓名,性别,班级) 其中每个学生的学号是唯一的,学号就是一个主键 课程表(课程编号,课程名,学分) 其中课程编号是唯一的,课程编号就是 ...

  5. MYSQL 中 OR 走不走索引

    目录 添加a.b独立索引 添加a.b组合索引 新建表test01,字段:id.a.b.c 添加a.b独立索引 EXPLAIN SELECT * FROM test01 WHERE a = 1 OR b ...

  6. mysql的in走不走索引?

    结论 mysql的in关键字不一定走索引. 个人猜测跟传入的元素个数和索引字段离散程度有关. 验证过程 -- mysql版本 select version(); -- 5.7.28-log-- 增加索 ...

  7. Mysql查询条件为大于时,不走索引失效问题排查

    我们都知道在数据库查询时,索引可以极大的提高查询效率.通常在使用的时候,都会针对频繁查询的关键字段建立索引. 比如,当以交易日期(trans_date)来查询交易记录时,通常会对该字段添加索引,以便在 ...

  8. mysql中生成列与JSON类型的索引

    MySQL中支持生成列,生成列的值是根据列定义中包含的表达式计算的. 一个简单的例子来认识生成列! CREATE TABLE triangle( sidea DOUBLE, sideb DOUBLE, ...

  9. MySQL中会用到age字段的索引_MySQL学习笔记(四):正确使用索引(二)

    上一篇学习到了MySQL中的索引是什么,以及一些关于索引的简单的知识,这篇我打算详细地谈一谈如何正确地使用索引.索引的使用看起来很简单,但是在真正去学习它的时候才发现,原来是暗藏玄机.使用索引时有很多 ...

最新文章

  1. AI求解薛定谔方程,兼具准确度和计算效率,登上《自然-化学》
  2. (Matlab)从已知向量中随机提取若干元素
  3. 蓝桥杯2016省赛真题-剪邮票(dfs)
  4. dcdc芯片效率不高的原因_半导体厂商如何做芯片的出厂测试?
  5. CentOS 6.2 安装教程
  6. 无心剑英译朱自清《匆匆》
  7. 开启手机新时代,智领5G未来:中国电信首款5G定制高端机震撼登场
  8. php 删除字符前缀,thinkphp3.2.3如何删除同一前缀的缓存(File)
  9. win10系统如何查找字体库位置+在matplotlib散点图中的应用+散点图中显示不了中文
  10. c语言贪吃蛇积分用什么函数,C语言之贪吃蛇(curses库函数)
  11. Python_机器学习_常用科学计算库_第5章_Pandas
  12. appuim + python 实现 趣头条 自动阅读
  13. 深度学习MatConvNet安装
  14. 哲理故事三百篇[转]
  15. 太一硅谷实验室合伙人杨虎成:区块链草莽时代进入倒计时,马太效应开始显现...
  16. Gateway 出现Can not connect to tcp://127.0.0.1: Connection refused
  17. “Your Firefox profile cannot be loaded. It may be missing or inaccessible.“
  18. JAVA8 UnaryOperator接口
  19. vue项目怎么修改项目名称
  20. Android小练习2——制作点菜界面

热门文章

  1. android照片如何查看时间,【技巧】如何查看图片的拍摄地点和日期时间等信息...
  2. 【万人千题】结对编程排位赛(第一期) 第二周 排名公布,冠军成功卫冕,啊这……
  3. 今日金融词汇--- TO G 业务,是什么
  4. 今日金融词汇---基本面分析
  5. memset(G, 0x3f, sizeof(G))涵义
  6. 一道很水的题(南工校赛决赛第一题)
  7. 论文笔记-Domain Adaptation for Semantic Segmentation with Maximum Squares Loss
  8. android 电子书框架,[Android] Pdf开发框架使用
  9. excel向程序发送命令时出现错误
  10. java初始化二维数组的三种方式