mysqlin元素过多导致全表扫描

mysqlin元素过多导致全表扫描,第1张

mysqlin元素过多导致全表扫描效率低。如果in里的参数过多,mysql可能会放弃走索引,进而进行全表扫描,影响效率。这种情况可以把in里的参数拆分,使得sql重新走上索引,多个结果走索引后再合并,也比全表扫描快。

MySQL中使用IN会不会走索引

文章很短,先看下结论,在看下文。

结论:IN肯定会走索引,但是当IN的取值范围较大时会导致索引失效,走全表扫描

navicat可视化工具使用explain函数查看sql执行信息

场景1:当IN中的取值只有一个主键时

我们只需要注意一个最重要的type 的信息很明显的提现是否用到索引:

type结果值从好到坏依次是:

system >const >eq_ref >ref >fulltext >ref_or_null >index_merge >unique_subquery >index_subquery >range >index >ALL

all:全表扫描

index:另一种形式的全表扫描,只不过他的扫描方式是按照索引的顺序

range:有范围的索引扫描,相对于index的全表扫描,他有范围限制,因此要优于index

ref: 查找条件列使用了索引而且不为主键和unique。其实,意思就是虽然使用了索引,但该索引列的值并不唯一,有重复。这样即使使用索引快速查找到了第一条数据,仍然不能停止,要进行目标值附近的小范围扫描。但它的好处是它并不需要扫全表,因为索引是有序的,即便有重复值,也是在一个非常小的范围内扫描。

const:通常情况下,如果将一个主键放置到where后面作为条件查询,mysql优化器就能把这次查询优化转化为一个常量。至于如何转化以及何时转化,这个取决于优化器

一般来说,得保证查询至少达到range级别,最好能达到ref,type出现index和all时,表示走的是全表扫描没有走索引,效率低下,这时需要对sql进行调优。

当extra出现Using filesor或Using temproary时,表示无法使用索引,必须尽快做优化。

possible_keys:sql所用到的索引

key:显示MySQL实际决定使用的键(索引)。如果没有选择索引,键是NULL

rows: 显示MySQL认为它执行查询时必须检查的行数。

这里可以参考之前写的一篇:用MySQL 执行计划分析 DATE_FORMAT 函数对索引的影响

场景2:扩大IN中的取值范围

此时仍然走了索引,但是效率降低了

场景3:继续扩大IN的取值范围

看上面的图,发现此时已经没有走索引了,而是全表扫描。

在说一下结论

结论:IN肯定会走索引,但是当IN的取值范围较大时会导致索引失效,走全表扫描。

By the way:如果使用了 not in,则不走索引。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/6106924.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-15
下一篇 2023-03-15

发表评论

登录后才能评论

评论列表(0条)

保存