零、基础资料
- 数据结构演示地址
- https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
一、常见的数据结构
索引是帮助MySQL高效获取数据的排好序的数据结构/
-
Hash表
-
二叉树(Binary Search Trees)
-
红黑树(Red-Black Trees)
-
B 树(B Trees)
-
B+ 树(B Trees)
上面列举了几个常见的数据结构, 在分析Mysql为什么使用B+ 树前, 下面会分别分析其它数据结构存在的优/劣势
二、Hash表
2.1 Hash结构介绍
- 哈希表是一种组合的数据结构, 它通常的实现方式存在下面两种, 它是一种牺牲空间去换时间的数据结构, 其核心是**哈希函数**, 哈希表最关键的冲突问题也取决于哈希函数的设计。
- 数组 + 链表
- 数组 + 红黑树
- 哈希表特点
- 一致性, 如果 a == b, 则 hash(a) = hash(b)
- 高效性, 哈希函数计算高效简便
- 均衡性, 哈希值均匀分布
- 已存在的使用情况举例
- HashMap、TreeMap等JDK常用数据结构
- Redis的Hash数据结构
2.2 Hash结构的优势
由于哈希函数计算高效简便, 对索引的key进行一次hash计算就可以定位出数据存储的位置, Hash索引针对 “=”、“IN” 查询会很高效, 和B+ 树从根节点查询数据相比效率要高。
2.3 Hash结构的劣势
- 索引key是通过hash计算的, 不能用于范围过滤
- B+ 树是一颗有序的数据结构, 而Hash表无法保证key在hash计算前后顺序保持一致, 即无法通过hash大小关系得到排序结果
- B+ 树存在**联合索引**, 可以根据做匹配原则进行数据查询, 而Hash表只能将 联合索引 的所有字段组合在一起作为 key来使用, 没有左匹配规则
- 即使很好的**