2:MySQL索引选择规则(唯一索引查询)
students_origin表中只有主键,没有建立索引。
select id, name from students_origin;
根据MySQL 索引选择原则分析(一)2.1来分析,所以只能是全表扫描。
students表中除主键外,还有3个索引唯一索引name,普通索引major,rank,联合索引rank/total。
select id, name from students;
根据MySQL 索引选择原则分析(一)2.1来分析,所以只查询了一次辅助索引name。获取到结果集。
select id, major from students;
根据MySQL 索引选择原则分析(一)2.1来分析,所以只查询了一次辅助索引major。获取到结果集。
3:MySQL索引选择规则(多个索引查询)
select id, rank from students;
根据MySQL 索引选择原则分析(一)2.1与2.3来分析,索引被2个索引覆盖,所以选择了索引长度最短的做查询,获取到结果集。
4:MySQL索引选择规则(联合索引查询)
select id, rank, total from students;
根据MySQL 索引选择原则分析(一)2.1来分析,所以只查询了联合索引rank/total。获取到结果集。
5:MySQL索引选择规则(条件索引查询)
根据MySQL 索引选择原则分析(一)2.1来分析,查询的结果集中包含了rank/total字段,应该走的是联合索引,但是
查询执行计划为:
没有走联合索引,而是选择了rank索引,主要原因是where条件改变了查询优化器的处理逻辑。查询优化器根据查询条件通过基于代价的处理,选择查询代价最低的索引。也就是说,首先通过索引idx_rank查找键值,在通过主键id查找对应的记录,也就是需要2次IO操作。反而不如直接走联合索引(只需一次IO操作)。
来源:oschina
链接:https://my.oschina.net/u/1269959/blog/516872