当前位置:网站首页>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开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦
边栏推荐
猜你喜欢

1. 获取数据-requests.get()

Go语学习笔记 - gorm使用 - 表增删改查 Web框架Gin(八)

Heuristic merge, DSU on Tree

生成器知道鉴别器在无条件GANs中应该学习什么

MySQL8--Windows下使用压缩包安装的方法

Redis主从、哨兵、 Cluster集群一锅端!

详解最强分布式锁工具:Redisson

mysql8.0.28 download and installation detailed tutorial, suitable for win11

- daily a LeetCode 】 【 9. Palindrome

JSP WebSehll 后门脚本
随机推荐
MySQL8.0.26安装配置教程(windows 64位)
2022.8.1-----leetcode.1374
【每日一道LeetCode】——1. 两数之和
知识体系树
第一章——线性表(顺序表和链表)
ASP WebShell backdoor script and anti-kill
cadence landscape bindkey
WebShell特征值汇总与检测工具
mockjs生成假数据的基本使用
(一)Redis: 基于 Key-Value 的存储系统
7-43 字符串关键字的散列映射 (25 分) 谜之测试点
Recursively check if a configuration item has changed and replace it
MySQL8--Windows下使用压缩包安装的方法
合奥科技网络 面试(含参考答案)
数仓:数仓从ETL到ELT架构的转化以及俩者的区别
“带薪划水”偷刷阿里老哥的面经宝典,三次挑战字节,终成正果
IPFS deployment and file upload (golang)
剑指 Offer 14- I. 剪绳子
指针数组和数组指针
[LeetCode] 94. Inorder traversal of binary tree