1.0 Mysql索引的数据结构与算法
Mysql索引的数据结构与算法
一、索引
索引是高效获取排好序的数据结构。
索引本身就是数据一部分关键信息,通过索引大大减少索引的数据量。
索引信息需要额外的空间存储。创建和维护索引本身也会降低对数据的操作性能。
大多数情况下,索引查询都是比全表扫描要快的。但是如果数据库的数据量不大,那么使用索引也不一定能够带来很大提升。
需要了解常用的索引数据结构:
- hash表
- B-Tree和B+树
1.1 hash表
优点:键值的集合,通过键(key)即可快速取出对应的值(value),接近 O(1)
缺点:
- Hash冲突问题(需要设计更好的哈希算法和更大的空间分散)
- 仅能满足 “=”,“IN”,不支持顺序和范围查询(最大的缺点)
// 举例哈希算法
hash = hashfunc(key)
index = hash % array_size
哈希冲突:多个不同的 key 最后得到的 index 相同
1.2 B-Tree和B+树
B树
- 叶节点具有相同的深度,叶节点的指针为空
- 所有索引元素不重复
- 节点中的数据索引从左到右递增排列
B+树(InnoDB使用)
- 非叶子节点不存储data,只存储索引(冗余),可以放更多的索引
- 叶子节点包含所有索引字段
- 叶子节点用指针连接,提高区间访问的性能
1.3 聚簇索引和非聚簇索引
索引和数据的存放位置不同分为聚簇索引,非聚簇索引
非聚簇索引:MyISAM索引文件和数据文件是分离的。由于数据和索引信息是分离的,在使用的时候就需要付出更大的io成本。
聚簇索引:InnoDB索引和数据源文件是聚合的。
- 表数据文件本身就是按B+Tree组织的一个索引结构文件
- 聚集索引-叶子节点包含了完整的数据记录
- InnoDB表必须建主键,并且推荐使用整型的自增主键(更小的cpu和io成本)
- 非主键索引结构叶子节点存储的是主键值(一致性和节省存储空间)
1.4 联合索引结构
最左前缀索引原则就是由联合索引结构决定的。
以联合索引字段从左到右的顺序优先级组织数据文件,而形成的B+树结构