MySQL不同索引的区别(InnoDB引擎)

数据库的索引类型

从物理存储角度,索引可以分为以下两类:

    聚集索引(主键索引):按照每张表的主键构造一颗B+树,同时叶子节点中存放的即为整张表的记录数据。聚集索引的叶子节点称为数据页,聚集索引的这个特性决定了主索引文件和数据文件为同一份文件,数据的排列顺序和索引的排列顺序一致。
    非聚集索引(又叫辅助索引,二级索引,非主键索引):在聚集索引之上创建的索引称之为辅助索引。辅助索引并不存储数据,只存储主键的值,如果使用辅助索引搜索数据就必须先从辅助索引取到主键的值,再使用主键的值去主键索引上查询,直到找到叶子节点上的数据返回,这个操作也称之为回表。叶子节点存放的不是实际数据,而是指向实际数据的指针。

在这里插入图片描述

MySQL不同索引的区别(InnoDB引擎)_第1张图片

 

有一种特殊的辅助索引叫做覆盖索引,覆盖索引是非聚集组合索引的一种形式,可以避免回表操作。覆盖索引包括在查询里的select、join和where子句用到的所有列,即建立索引的字段正好覆盖了查询语句[select子句]与查询条件[Where子句]中所涉及的字段。因此我们需要select出来的列都已经存在了索引树的叶子节点上。

不是所有类型的索引都可以成为覆盖索引。覆盖索引必须要存储索引的列,而哈希索引、空间索引和全文索引等都不存储索引列的值,所以MySQL只能使用B+Tree索引做覆盖索引。

从逻辑角度,索引可以分为以下几类:

    普通索引:最基本的索引,它没有任 何的限制,仅加速查询。
    唯一索引:它与前面的普通索引类似,不同的是索引列的值必须唯一,但允许有空值。
    主键索引:它是一种特殊的唯一索引,不允许有空值,一般是在建表的时候同时创建主键索引。
    联合索引(又叫做多列索引,复合索引):多列值组成一个索引,专门用于复合查询,其效率大于索引合并(索引合并是使用多个单列索引组合搜索)。

聚集索引和非聚集索引的效率

    聚集索引的范围查询效率比非聚集索引高,因为只要找到第一个索引值记录,其余连续性的记录在物理上一样连续存放。
    聚集索引的修改效率比非聚集索引低,因为为了使数据和索引的排列顺序一致,在插入记录的时候,会对数据页重新排序。

唯一索引和主键的区别

    主键既是约束,也是一种特殊的唯一索引,主键字段不能为NULL,唯一索引可以为NULL。
    主键可以被其他表引用为外键,而唯一索引不能。
    一个表最多只能创建一个主键,但可以创建多个唯一索引。
 

 

 

你可能感兴趣的:(MySQL,索引,mysql,数据库)