# mysql 索引1

这是我参与8月更文挑战的第7天,活动详情查看:8月更文挑战数据库

概述

索引的出现是为了提升数据的查询效率,就像书的目录同样。一本500页的书,若是你想快速找到其中的某一个知识点,在不借助目录的状况下,那我估计你可得找一下子。一样,对于数据库的表而言,索引其实就是它的“目录”。markdown

一样索引也会带来不少负面影响:建立索引和维护索引须要耗费时间,这个时间随着数据量的增长而增长;索引须要占用物理空间,不光是表须要占用数据空间,每一个索引也须要占用物理空间;当对表进行增、删、改、的时候索引也要动态维护,这样就下降了数据的维护速度。数据结构

创建索引的原则:

  1. 在最频繁使用的、用以缩小查询范围的字段上创建索引;
  2. 在频繁使用的、须要排序的字段上创建索引。

不适合创建索引的状况:

  1. 对于查询中不多涉及的列或者重复值比较多的列,不宜创建索引;
  2. 对于一些特殊的数据类型,不宜创建索引,好比:文本字段(text)等。

索引底层的数据结构

索引的数据结构和具体存储引擎的实现有关,,在MySQL中使用较多的索引有 Hash 索引、B+树索引等。而咱们常常使用的 InnoDB 存储引擎的默认索引实现为 B+ 树索引。post

B+ 数

  1. B+ 树是基于 B 树和叶子节点顺序访问指针进行实现,它具备 B 树的平衡性,而且经过顺序访问指针来提升区间查询的性能。
  2. 在 B+ 树中,一个节点中的 key 从左到右非递减排列,若是某个指针的左右相邻 key 分别是 key i 和 key i+1,且不为 null,则该指针指向节点的全部 key 大于等于 key i 且小于等于 key i+1。
  3. 进行查找操做时,首先在根节点进行二分查找,找到一个 key 所在的指针,而后递归地在指针所指向的节点进行查找。直到查找到叶子节点,而后在叶子节点上进行二分查找,找出 key 所对应的 data。
  4. 插入、删除操做会破坏平衡树的平衡性,所以在插入删除操做以后,须要对树进行一个分裂、合并、旋转等操做来维护平衡性。

B+树与B树

用 B+ 树不用 B 树考虑的是 IO 对性能的影响,B 树的每一个节点都存储数据,而 B+ 树只有叶子节点才存储数据,因此查找相同数据量的状况下,B 树的高度更高,IO 更频繁。数据库索引是存储在磁盘上的,当数据量大时,就不能把整个索引所有加载到内存了,只能逐一加载每个磁盘页(对应索引树的节点)。性能

相关文章
相关标签/搜索