聚簇索引:
一张表只能有一个聚簇索引,通常是主键列,在innodb存储引擎中由聚簇索引构成的b+tree其的节点中key就是主键id,叶子节点上存储的就是一行记录的所有字段。
非聚簇索引:
一个表中可以有多个,叶子节点存放的不是一整行数据,而是主键,所以无法命中覆盖索引时会需要通过叶子结点中的主键去聚簇索引的b+tree中再次寻找,也就是常说的非聚簇索引无法命中覆盖索引时会造成两次b+tree的搜索。
联合索引:
就是由多列组成的的索引。遵循最左前缀规则。对where,order by,group by 都生效
覆盖索引:
指从辅助索引中就能获取到需要的记录,而不需要查找聚簇索引中的记录。使用覆盖索引的一个好处是因为辅助索引不包括一条记录的整行信息,所以数据量较聚集索引要少,可以减少大量io操作。
聚集索引与辅助索引的区别:
叶子节点是否存放的为一整行数据
最左前缀规则:
假设联合索引由列(a,b,c)组成,则一下顺序满足最左前缀规则:a、ab、abc;selece、where、order by 、group by都可以匹配最左前缀。其它情况都不满足最左前缀规则就不会用到联合索引。
order by排序分为file sort和index,后者效率更高
以下情况不会使用index排序
1、检查的行数过多,并且没有使用覆盖索引。
2、使用了多个索引,mysql一次只会采用一个索引。
3、对索引列同时使用了ASC和DESC。 通过where语句将order by中索引列转为常量,则除外。
4、where与order by使用了不同的索引,与第二条类似
5、where或者ORDER BY中索引列使用了表达式(+1,-1这种操作),包括函数表达式。参见第8,9句
6、where 与ORDER BY组合满足最左前缀,但where中使用了范围查询。
7、order by中加入了非索引列,且非索引列不在where中。
8、order by或者它与where组合没有满足索引最左前列。
9、当使用left join,使用右边的表字段排序。