1.索引
1.1 索引概述
MySQL官方对索引的定义:索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库还维护着满足特定查找算法的数据结构,这些数据结构以某种引用(指向)数据,这样就可以再这些数据结构上实现高级查找算法
1.2 索引优势劣势
优势:
- 类似于书籍的目录索引,提高数据检索的效率,降低数据库的IO成本
- 通过索引对数据进行排序,降低数据排序的成本,降低CPU消耗
劣势:
- 索引实际上也是一张表,该表中保存了逐渐与索引字段,并指向实体类的记录,所以索引列也是需要占用空间的
- 虽然所以大大提高了查询的效率,同时却也降低了更新表的速度
1.3 索引结构
索引是MySQL的存储引擎层中实现的,而不是在服务器层,所以每种存储引擎的索引都不一定完全相同,也不是所有的存储引擎都支持所有的索引类别
四种索引
- BTREE索引:最常见的索引类型,大部分都支持B树索引
- HASH索引:至于Memory引擎支持,使用场景简单
- R-tree(空间索引):空间索引是MyISAM索引的一个特殊索引类型,主要用于地理位置的数据结构,使用较少
- Full.text(全文索引):全文索引也是MyISAM索引的一个特殊索引类型,InnoDB从MySQL5.6版本开始也支持全文索引
我们平常所说的索引,如果没有特别说明,都是指B+树(多路搜索树,并不一定是二叉树)结构组织的索引。其中聚集索引、复合索引、前缀索引、唯一索引默认都是使用B+tree索引。
1.3.1 BTree结构
BTtee又叫多路平衡搜索树,一颗m叉的BTree特性如下
- 树中每个节点最多包含m个孩子
- 除根节点与叶子节点外,每个节点至少有ceil(m/2)个孩子
- 若根节点不是叶子节点,则至少有两个孩子
- 所有的叶子节点都在同一层
- 每个非叶子节点由n个key与n+1个指针组成其中ceil(m/2) + 1 <=n <= m-1
image.png以5叉BTree为例,key的数量:ceil(5/2)-1 <= n <= 5-1,所有2<=n<=4,当n>4时,中间节点分裂到父节点,两边节点分裂
该BTree与二叉树相比,查询效率更高,因为对于相同的数据量来说,BTree的层级结构比二叉树小,因此搜索速度快。
1.3.2 B+Tree结构
B+Tree为BTree的变种,B+Tree与BTree的区别如下
- n叉B+Tree最多包含n个key,而BTree最多包含n-1个key
- B+Tree的叶子节点保存所有的key信息,依key大小顺序排列
- 所有的非叶子节点都可以看做是key的索引部分
由于B+Tree只有叶子节点保存key信息,查询任何key都要从root走到叶子,所以B+Tree的查询效率更加稳定
1.3.3 MySQL中的B+Tree
image.pngMySQL索引数据结构对经典的B+Tree进行了优化,在B+Tree的基础上,增加一个指向相邻叶子节点的链表指针,就形成了带有顺序指针的B+Tree,提高区间访问的性能。
1.4 索引的分类
- 单值索引:一个索引只包含单个列,一个表可以有多个
- 唯一索引:索引列的值必须唯一,但允许有空值
- 符合索引:一个索引包含多个列
1.5 索引的创建原则
- 对查询频次较高,数据量比较大的表
- 索引字段的选择,在where字句条件中
- 使用唯一索引,区分度越高,索引效率越高
- 使用短索引
- 利用最左前缀
网友评论