测试关键字: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走不走索引和后面的数据有关系。