in是否使用【索引】

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

  1. EXPLAIN SELECT * from users;

查询结果:
image.png

  1. id // 选择标识符
  2. select_type // 表示查询的类型
  3. table // 输出结果集的表
  4. partitions // 匹配的分区
  5. type // 表示表的连接类型,
  6. possible_keys // 表示查询时,可能使用的索引
  7. key // 表示实际使用的索引
  8. key_len // 索引字段的长度
  9. ref // 列与索引的比较
  10. rows // 扫描出的行数(估算的行数)
  11. filtered // 按表条件过滤的行百分比
  12. Extra // 执行情况的描述和说明

type对应的值有:
ALL、index、range、 ref、eq_ref、const、system、NULL
性能从左到右越来越好,一般一个好的sql语句至少要达到range级别。

  1. ALL:全表扫描,应当避免该类型
  2. index:索引全局扫描,indexALL区别为index类型只遍历索引树
  3. range:检索索引一定范围的行
  4. ref:非唯一性索引扫描,返回匹配某个单独值的所有行
  5. eq_ref:唯一索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见主键或唯一索引扫描
  6. const:表示通过一次索引就找到了结果,常出现于primary keyunique索引
  7. systemsystemconst类型的特例,当查询的表只有一行的情况下,使用system
  8. NULLMySQL在优化过程中分解语句,执行时甚至不用访问表或索引,是最高的等级

使用主键索引查询:

  1. EXPLAIN SELECT user_id from users;

image.png
使用联合索引下的in查询
1)当in后面的数据在数据表中超过30%的匹配时(括号里的id),会走全表扫描,即不走索引,示例sql

  1. EXPLAIN SELECT user_id,user_name,password from users WHERE user_name in ('123','124','125','126','127','128');

image.png
示例sql:

  1. EXPLAIN SELECT user_id,user_name,password from users WHERE user_name in ('123','124');

当结果数据小于30%时会走索引,这里走的联合索引。
image.png