MySQL面试题——in是否使用【索引】
【摘要】 测试关键字:explain[ɪkˈspleɪn]【解释】explain在MySQL中的作用是:用于解释SQL语句的语法。前提:当表内存在多个单列索引时,MySQL不会自动选择in条件使用的索引,即使它是最优索引。正文内容:首先,我们要知道测试语句是怎么解释的:编辑其中返回的内容代表:id // 选择标识符select_type // 表示查询的类型table // 输出结果集的表part...
测试关键字:explain[ɪkˈspleɪn]【解释】
explain
在MySQL中的作用是:用于解释SQL语句的语法。
前提:
当表内存在多个单列索引时,MySQL不会自动选择in条件使用的索引,即使它是最优索引。
正文内容:
首先,我们要知道测试语句是怎么解释的:
其中返回的内容代表:
type对应的值有:
ALL、index、range、 ref、eq_ref、const、system、NULL
这几种类型从左到右,性能越来越高。一般一个好的sql语句至少要达到range级别。
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)