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

2022-11-30 17:13:35 浏览数 (1)

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

explain

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

前提:

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


正文内容:

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

其中返回的内容代表:

代码语言:javascript复制
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级别。

代码语言:javascript复制
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走不走索引和后面的数据有关系。

0 人点赞