F_JustWei's Studio.

索引

字数统计: 1.3k阅读时长: 4 min
2021/04/18 Share

索引

1、索引

索引是帮助MySQL高效获取数据的数据结构

2、索引的优点

  • 提高搜素数据的搜索速度。
  • 加快表与表之间的连接速度。
  • 在信息检索过程中,若使用分组及排序子句进行时,通过建立索引能有效的减少检索过程中所需的分组及排序时间,提高检索效率。

3、索引的缺点

  • 创建索引的时候会占用存储空间。
  • 在需要修改表中的数据时,索引还需要进行动态的维护,所以对数据库的维护带来了一定的麻烦。
  • 在我们建立数据库的时候,需要花费的时间去建立和维护索引,随着数据量的增加,需要维护索引的时间也会增加。

4、索引的分类

从存储结构上划分

  • Hash索引
  • B-Tree索引
  • B+Tree索引
  • Full-index全文索引
  • R-Tree索引

从应用层次上划分

  • 普通索引
  • 唯一索引
  • 复合索引

从数据的物理顺序与键值的逻辑顺序来划分

  • 聚簇索引
  • 非聚簇索引
4.1 Hash索引

基于哈希表实现,只有精确匹配索引所有列的查询才有效,对于每一行数据,存储引擎都会对所有的索引列计算一个哈希码(hash code),并且Hash索引将所有的哈希码存储在索引中,同时在索引表中保存指向每个数据行的指针。

4.2 B-Tree索引

B-Tree是最常用于索引的数据结构。因为B-Tree的插入、删除、修改、查找操作都可以在对数时间内完成。并且存储在B-Tree中的数据是有序的。

4.3 B+Tree索引

B+Tree是B-Tree的改进版本。B+Tree的数据都在叶子节点上,并且所有叶子节点形成有序链表,便于范围查询。

4.4 聚簇索引

索引项的排序方式和表中数据记录排序方式一致的索引。所以一个表只能有一个聚簇索引。

image-20210419215258740

聚簇索引的优点

  1. 数据访问更快,因为聚簇索引将索引和数据保存在同一个B+树中。
  2. 聚簇索引对于主键的排序查找和范围查找速度非常快,因为其数据是按照大小排列的。

聚簇索引的缺点 

  1. 插入速度严重依赖于插入顺序,按照主键的顺序插入是最快的方式,否则将会出现页分裂,严重影响性能。因此,对于InnoDB表,我们一般都会定义一个自增的ID列为主键
  2. 更新主键的代价很高,因为将会导致被更新的行移动。因此,对于InnoDB表,我们一般定义主键为不可更新。
  3. 二级索引访问需要两次索引查找,第一次找到主键值,第二次根据主键值找到行数据。
4.5 非聚簇索引

索引的逻辑顺序与磁盘上行的物理存储顺序不同,一个表中可以拥有多个非聚簇索引。

image-20210419215441751

5、聚簇索引和非聚簇索引的区别

  • 聚簇索引的叶子节点存放的是主键值和数据行,支持覆盖索引。非聚簇索引的叶子节点存放的是主键值或指向数据行的指针。

  • 由于叶子节点(数据页)只能按照一颗B+Tree排序,故一张表只能有一个聚簇索引。非聚簇索引的存在不影响聚簇索引中数据的组织,所以一张表可以有多个非聚簇索引。

6、mysql默认存储引擎的索引建立

mysql默认存储引擎innodb只显式支持B-Tree( 从技术上来说是B+Tree)索引,对于频繁访问的表,innodb会透明建立自适应hash索引,即在B-Tree索引基础上建立hash索引,可以显著提高查找效率,对于客户端是透明的,不可控制的,隐式的。

7、为什么mysql索引结构默认使用B+Tree,而不是B-Tree,Hash,二叉树,红黑树?

  • B-tree:因为B树不管叶子节点还是非叶子节点,都会保存数据,这样导致在非叶子节点中能保存的指针数量变少,指针少的情况下要保存大量数据,只能增加树的高度,导致IO操作变多,查询性能变低;
  • Hash:虽然可以快速定位,但是没有顺序,IO复杂度高。

  • 二叉树:树的高度不均匀,不能自平衡,查找效率跟树的高度成反比,并且IO代价高。

  • 红黑树:树的高度随着数据量增加而增加,IO代价高。

8、为什么官方建议使用自增长主键作为索引?

结合B+Tree的特点,自增主键是连续的,在插入过程中尽量减少页分裂,即使要进行页分裂,也只会分裂很少一部分。并且能减少数据的移动,每次插入都是插入到最后。总之就是减少分裂和移动的频率。

参考链接

Mysql索引详解

CATALOG
  1. 1. 索引
    1. 1.0.1. 1、索引
    2. 1.0.2. 2、索引的优点
    3. 1.0.3. 3、索引的缺点
    4. 1.0.4. 4、索引的分类
      1. 1.0.4.0.1. 4.1 Hash索引
      2. 1.0.4.0.2. 4.2 B-Tree索引
      3. 1.0.4.0.3. 4.3 B+Tree索引
      4. 1.0.4.0.4. 4.4 聚簇索引
      5. 1.0.4.0.5. 4.5 非聚簇索引
  2. 1.0.5. 5、聚簇索引和非聚簇索引的区别
  3. 1.0.6. 6、mysql默认存储引擎的索引建立
  4. 1.0.7. 7、为什么mysql索引结构默认使用B+Tree,而不是B-Tree,Hash,二叉树,红黑树?
  5. 1.0.8. 8、为什么官方建议使用自增长主键作为索引?
  6. 1.0.9. 参考链接