您的位置:首页 > 数据库 > MySQL

mysql聚集索引,辅助索引,联合索引,覆盖索引

2018-03-22 21:06 453 查看

聚集索引:

一个表中只能有一个,聚集索引的顺序与数据真实的物理存储顺序一致。查询速度贼快,聚集索引的叶子节点上是该行的所有数据,数据索引能加快范围查询(聚集索引的顺序和数据存放的逻辑顺序一致)。主键!=聚集索引。

辅助索引(非聚集索引):

一个表中可以有多个,叶子节点存放的不是一整行数据,而是键值,叶子节点的索引行中还包含了一个'书签',这个书签就是指向聚集索引的一个指针,从而在聚集索引树中找到一整行数据。

联合索引:

就是由多列组成的的索引。遵循最左前缀规则。对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,使用右边的表字段排序。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mysql