- 数据库的高效查询离不开索引,那么索引是什么?索引的原理是啥?为何查询更快?
- 索引在mysql的定义是:索引是一个提高查询效率的数据结构。一个有序的数据集合,正因为有序所以利用高效的查询算法就可以提高查询的效率。
- 常见的查询算法:顺序查询,二分法查询,二叉树查询,块查询。
- 顺序查询:效率最低,因此也适合无序的数据集合查询。
- 二分法查询:即利用数据集的有序性,一次淘汰一半数据,从而提高查询的效率。
- 二叉树查询:常用的是平衡二叉树,即每个节点都只有两个子节点,且左边的节点都小于根节点,右边的节点都大于根节点。反之也可以。
- 块查询:即将数据集合分成一块块的,块与块之间有序,快内无序有序都可以。这样可以查找的效率。
- 可以看出,要想提高查询的效率关键还是构建一个有序的数据集,然后根据不同的算法生成对应的有序集合。
- 平衡多路二叉树:即B-tree,通过扩展节点的宽度,从而构建一个宽度和深度适合的集合,从而提高查询效率。
- B-tree的特点:一个m阶的B-tree 树,下图是3阶。即d=2 ,h=3
- 根节点非叶子节点,则至少有2个子节点。
- 除去根节点和叶子节点,其他节点至少有ceil(m/2)个子节点,这里就是至少2个子节点。
- 所有叶子节点的深度一致。
- d 大于等于1正整数,称为B-tree 的度,h 是B-tree的高度。
- 每个非叶子节点由n-1个key和n个指针组成,其中d<=n<=2d。
- 每个叶子节点最少包含一个key和两个指针,最多包含2d-1个key和2d个指针,叶节点的指针均为null 。
- B+tree B+ 树相对于B树的有点在于,B+ 采用内节点只存储key,所有数据存在于叶子节点。
- 叶子节点之间使用指针链接起来,构成一个有序的链表形式。
- 叶子节点深度一致。
- 在mysql的InnoDB存储引擎里:
- 主键建立主索引,主索引的最后的叶子节点存储的就是数据库表的记录,即key的value就是表的一条记录。
- 辅助索引的叶子节点指向的是主键ID。
- 这两点是与MyISAM 存储引擎不同之处。
- MyISAM 里叶子节点记录的是表中每行数据的起始地址。
- 辅助索引和主索引一样记录的都是地址。
- 索引的最左匹配规则:在abc三个列上建立一个联合索引,那么这个索引是怎样的呢?
| A | B | C |
| 1 | 2 | 3 |
| 1 | 4 | 2 |
| 1 | 1 | 4 |
| 2 | 3 | 5 |
| 2 | 4 | 4 |
| 2 | 4 | 6 |
- 联合索引就像是按照字典查找字一样,先查第一个字母,在查第二个字母,最后查第三个。
- 由此可见,索引存遵循最左前缀匹配规则。
注:ceil 向上取整。部分图片摘自网络。