数据库(MySQL):索引
1. 索引是什么
- 索引是帮助MySQL高效获取数据的排好序的数据结构。
2. MySQL索引选择
- 不使用二叉树的原因:易退化成链表。
- 不使用红黑树的原因:红黑树高度不可控。高度低,查询效率高;高度高,磁盘IO次数太多,查询效率低。
- 哈希索引:单记录查询时可用,性能最快。但不支持范围查询。
- BTree索引:B树 -> B+树 。
B树:
a. 叶子结点具有相同的深度,叶子结点指针为空
b. 所有索引元素不重复
c. 结点中的索引从左到右递增排序
B+树(B树的变种):
a. 非叶子结点不存储数据,只存储索引(冗余),可以放更多的索引
b. 叶子结点包含所有索引字段
c. 叶子结点用指针连接,提高区间访问的性能
哈希索引:
3. MySQL两种引擎索引的实现方式
-
MyISAM表
底层有三个文件:
frm:存储表结构
MYD:存储表数据
MYI:存储表索引
数据与索引是分开存储的,称其为非聚集索引(非聚簇索引、稀疏索引)
查找过程:先判断查找条件是不是索引字段,是的话去MYI文件定位到B+树的相应节点,拿出记录对应磁盘地址,去MYD文件定位到索引对应的记录。
-
InnoDB
底层有两个文件:
frm:存储表结构
ibd:存储数据和索引
聚集索引(聚簇索引)-叶子结点包含了完整的数据记录
相关问题:
1) 为什么建议InnoDB表必须建主键,且推荐使用整型的自增主键?
a. 如果不建主键,MySQL会自己悄悄增加一列做主键,MySQL性能会降低。
b. 整型比大小,比字符串效率高;整型占用空间小(高速SSD,价格昂贵)。
c. B+树叶子结点有序连接,若使用非自增,为保证其有序性,将数据插入某个位置,可能(16k满后)会导致结点分裂,效率降低。自增向后加元素,结点分裂可能性很低。
2)主键索引与二级索引(普通索引/非主键索引,非聚集索引,数据部分只存主键)
主键索引:
二级索引(普通索引/非主键索引):
3)索引最左前缀原理:用于联合索引结构,如("name", "age", "date"),不能跳过前面字段去用后面字段,原因:已从前向后排好序,只有前面字段相同,才会按后面字段排序。
参考链接:
https://www.bilibili.com/video/BV19a4y1W7y8?p=1
JavaGuide(公众号)