MySQL面试题——in是否使用【索引】

举报
红目香薰 发表于 2022/06/26 20:05:58 2022/06/26
【摘要】 ​测试关键字:explain[ɪkˈspleɪn]【解释】explain在MySQL中的作用是:用于解释SQL语句的语法。前提:当表内存在多个单列索引时,MySQL不会自动选择in条件使用的索引,即使它是最优索引。正文内容:首先,我们要知道测试语句是怎么解释的:​编辑其中返回的内容代表:id // 选择标识符select_type // 表示查询的类型table // 输出结果集的表part...

测试关键字:explain[ɪkˈspleɪn]【解释】

explain

在MySQL中的作用是:用于解释SQL语句的语法。

前提:

当表内存在多个单列索引时,MySQL不会自动选择in条件使用的索引,即使它是最优索引。


正文内容:

首先,我们要知道测试语句是怎么解释的:

编辑

其中返回的内容代表:

id // 选择标识符
select_type // 表示查询的类型
table // 输出结果集的表
partitions // 匹配的分区
type // 表示表的连接类型,
possible_keys // 表示查询时,可能使用的索引
key // 表示实际使用的索引
key_len // 索引字段的长度
ref // 列与索引的比较
rows // 扫描出的行数(估算的行数)
filtered // 按表条件过滤的行百分比
Extra // 执行情况的描述和说明

type对应的值有:

ALL、index、range、 ref、eq_ref、const、system、NULL

这几种类型从左到右,性能越来越高。一般一个好的sql语句至少要达到range级别。

ALL:全表扫描,应当避免该类型
index:索引全局扫描,index与ALL区别为index类型只遍历索引树
range:检索索引一定范围的行
ref:非唯一性索引扫描,返回匹配某个单独值的所有行
eq_ref:唯一索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见主键或唯一索引扫描
const:表示通过一次索引就找到了结果,常出现于primary key或unique索引
system:system是const类型的特例,当查询的表只有一行的情况下,使用system
NULL:MySQL在优化过程中分解语句,执行时甚至不用访问表或索引,是最高的登记

All代表是最垃圾的sql语句啦。所以只要看到all的语句,你就得想办法处理了。

对照组实验1(查询内容为主键):

可以看到其type的值是:index代表使用了索引

编辑

对照组实验2(查询内容为非主键非索引):

类型是All,代表不合适,垃圾sql

编辑

咱们一般in查询的肯定是id,既然正常的能使用index代表id,那么咱们测试一下。

对照组实验3(in查询主键索引):

查询所有信息的时候使用的是ALL类型,咱们换一个再试试

编辑

使用id查询完成后类型是index,代表使用了索引

编辑

那么这也就查一个id啊,但是一般要返回其好几个值嘞,现在查的东西比较多,我就查单个试试:

编辑单个查询的时候是走索引的,批量有问题,但是批量多少是有问题呢,这咱们就得弄个10万条左右的数据做测试了。

中间测试过程比较麻烦,我就没挨个截图,我测试了一下,也对照了其他人的文章,大致确认了数据范围。

测试结果:

in正常情况都是走索引的,当in后面的数据在数据表中超过【30%】的匹配时(括号里的id),会走全表扫描,即不走索引,因此in走不走索引和后面的数据有关系。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。