透彻理解数据库索引-数据库索引的种类以及优缺点

Posted 小伙伴们的小随笔

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了透彻理解数据库索引-数据库索引的种类以及优缺点相关的知识,希望对你有一定的参考价值。

数据库索引的种类以及优缺点

按照功能逻辑分为四种:


  1. 普通索引

普通索引是基础的索引,没有任何约束,主要用于提高查询效率。


  1. 唯一索引

唯一索引就是在普通索引的基础上添加了一个数据唯一性的约束条件。


  1. 主键索引(聚簇索引)

主键索引同样是在唯一索引的基础上添加了一个不为空的约束(NOT NULL DEFAULT),但是一张表最多只能有一个主键。


  1. 全文索引

mysql自带的全文索引只支持英文,一般采用专门的全文搜索引擎。


按照物理实现方式分为两种:


一 聚簇索引(聚集索引)


    聚集索引不是简单意义上的索引,而是DB数据的数据存储方式,具体的细节依赖于实现方式。Mysql中 InnoDB引擎 的聚簇索引底层数据结构采用 B+树 存储索引和数据。当一个表有聚簇索引时,这个表的数据实际上存放在索引的叶子节点(Leaf Page)上。聚簇 的意思就是把相邻行键值紧凑的在一起,因为不可能把数据存储两份,所以一个表只能有一个聚簇索引。

    下图就是InnoDB引擎中聚簇索引的B+树数据存储展示图,B+树非叶子节点只包含了索引节点,所有的数据全部存储在叶子节点。

图一 摘自 《高性能Mysql》


    InnoDB是通过主键聚集数据,上图一 B+树中的非叶子节点的就是主键索引。

如果当前表没有定义主键,InnoDB会选择一个非空索引代替。如果没有这样的索引,InnoDB会隐式的定义一个主键作为聚簇索引。


聚簇索引的优点:


  1. 查找效率比较高,通过聚簇索引可以直接拿到叶子节点中的数据,不需要像非聚簇索引一样还需要回表(二次查询)查询。

  2. 使用覆盖索引扫描的查询可以减少非聚簇索引的回表操作,直接使用叶子节点的主键值。


聚簇索引的缺点:


  1. 聚簇索引极大提高了I/O密度集型应用的性能,但是数据量比较小的话,全部放进内存,对于内存访问的顺序性对性能影响并不大,聚簇索引也就没优势了。

  2. 插入性能严重依赖于插入的顺序,在插入过程中不是按照主键的顺序,那么操作完成后最好使用 OPTIMIZE TABLE 命令重新组织一下数据表。(ps:OPTIMIZE TABLE 优化原理:该操作重建表更新索引的统计数据并释放未使用的空间。)

  3. 聚簇索引被更新或者插入会强制InnoDB将每个更新的行移动到新的位置,可能会导致当前页已满然后 页分裂(page Split),然后 InnoDB 就会创建新页存储数据,占用更多的磁盘空间。

  4. 聚簇索引在数据不密集、页分裂比较多、delete操作等情况下,导致数据存储不连续的情况下,全表扫描比较慢,所以可以定期使用 OPTIMIZE TABLE 来整理一下数据表。

  5. 非聚簇索引(二级索引)的可能会比较大,因为二级索引的叶子节点存储的数据就是当前行的主键列,所以当聚簇索引(主键)比较大的时候,二级索引也会比较大。

  6. 非聚簇索引(二级索引)需要二次索引查找(回表)。①找到二级索引②通过二级索引找到主键索引,然后取出主键索引节点中的数据。


二 非聚簇索引(二级索引)


三 聚簇索引 和 非聚簇索引的区别和联系

下面用一个表示例来说明 聚簇索引 和 非聚簇索引的区别

mysql> create table P (ID int primary key,ranking int NOT NULL DEFAULT 0 comment "排名",,plname varchar(16) NOT NULL DEFAULT '' comment "语言名称",index p(plname))engine=InnoDB;


透彻理解数据库索引(1)-数据库索引的种类以及优缺点


下图就是聚簇(主键)索引底层 B+树 示意图

上图的非叶子节点存储的就是主键索引,非叶子节点Key存储的就是主键索引ID,Value是子节点指针P,然后叶子节点Value存储的数据就是当前行数据。


下图就是非聚簇(二级)索引底层 B+树 示意图

上图就是非聚簇索引B+树示意图,非叶子节点存储的Key就是二级索引,Value存储的就是主键索引的指针。


区别:

  1. 通过聚簇(主键)索引扫描数据的时候,只需要一次就可以从主键索引的叶子节点拿到数据


以上多处内容摘自:《高性能Mysql》


强烈建议阅读原文,有道笔记的排版好很多,感谢大家。

以上是关于透彻理解数据库索引-数据库索引的种类以及优缺点的主要内容,如果未能解决你的问题,请参考以下文章

Atitit.数据索引 的种类以及原理实现机制 索引常用的存储结构

Mysql(12)—哈希索引的数据结构以及索引的优缺点

mysql的索引

如何创建mysql索引以及索引的优缺点

pymysql操作数据库与索引

MySQL索引——从入门到出土