首页 > 数据库 > MySQL > 正文

mysql中in会不会用索引

2024-07-24 12:32:50
字体:
来源:转载
供稿:网友
  今天小编给大家分享一下mysql中in会不会用索引的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

  mysql中in是否会用索引的两种情况:1、当in的取值范围较小时,in会走索引;2、当in的取值范围较大时,in不走索引,而是会用全表扫描。因为in的条件过多时,返回的数据就会很多,可能会导致应用堆内内存溢出,导致索引失效。
 
  本教程操作环境:windows10系统、mysql8.0.22版本、Dell G3电脑。
 
  结论: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时,表示无法使用索引,必须尽快做优化。
 
  key:显示MySQL实际决定使用的键(索引)。如果没有选择索引,键是NULL
 
  rows: 显示MySQL认为它执行查询时必须检查的行数。
 
  场景2:扩大IN中的取值范围
 
  此时仍然走了索引,但是效率降低了
 
  场景3:继续扩大IN的取值范围
 
  发现此时已经没有走索引了,而是全表扫描。
 
  在说一下结论
 
  结论:IN肯定会走索引,但是当IN的取值范围较大时会导致索引失效,走全表扫描。
 
  By the way:如果使用了 not in,则不走索引。
 
  以上就是“mysql中in会不会用索引”这篇文章的所有内容,感谢各位的阅读!
 

(编辑:武林网)

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表