in是否使用【索引】
当表内存在多个单列索引时,MySQL不会自动选择in条件使用的索引,即使它是最优索引。
示例sql:
EXPLAIN SELECT * from users;
查询结果:
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级别。
ALL:全表扫描,应当避免该类型index:索引全局扫描,index与ALL区别为index类型只遍历索引树range:检索索引一定范围的行ref:非唯一性索引扫描,返回匹配某个单独值的所有行eq_ref:唯一索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见主键或唯一索引扫描const:表示通过一次索引就找到了结果,常出现于primary key或unique索引system:system是const类型的特例,当查询的表只有一行的情况下,使用systemNULL:MySQL在优化过程中分解语句,执行时甚至不用访问表或索引,是最高的等级
使用主键索引查询:
EXPLAIN SELECT user_id from users;

使用联合索引下的in查询
1)当in后面的数据在数据表中超过30%的匹配时(括号里的id),会走全表扫描,即不走索引,示例sql
EXPLAIN SELECT user_id,user_name,password from users WHERE user_name in ('123','124','125','126','127','128');

示例sql:
EXPLAIN SELECT user_id,user_name,password from users WHERE user_name in ('123','124');
当结果数据小于30%时会走索引,这里走的联合索引。
