2. 浅谈 Mysql 的储存引擎和索引
存储引擎
Mysql 有几种存储引擎:
- MyISAM
- InnoDB
- MERGE
- MEMORY(HEAP)
其中,MySQL 5.1 之前默认使用 MyISAM 引擎,5.1 之后默认使用 InnoDB
下面说说,InnoDB 和 MyISAM:
区别:
特点 | MyISAM | InnoDB |
---|---|---|
存储限制 | 无 | 64TB |
事务 | 不支持 | 支持 |
锁机制 | 表锁 | 行锁 |
哈希索引 | 不支持 | 支持 |
全文索引 | 支持 | 不支持(5.6.4 开始支持) |
外键 | 不支持 | 支持 |
内存与空间使用 | 较低 | 较高 |
相同:
特点 | MyISAM | InnoDB |
---|---|---|
B 树索引 | 支持 | 支持 |
索引缓存 | 支持 | 支持 |
索引
在 MySQL 中,常用的有两种,一种是哈希索引,一种是 B+ Tree
1. B+ 树索引原理
数据库最广泛使用的索引数据结构,同时也是 InnoDB 默认索引实现方式
B+ Tree 是基于 B Tree 改进来的一种平衡树,本质没什么不同,就是叶子结点多了顺序访问指针,因此,它可以通过顺序访问指针来提高区间查询的性能
B+ Tree 的一个结点中的 key,从左到右,按照从小到大(或等于)排列
查找的时候,按照二分查找,插入删除需要进行分裂、合并、旋转操作调整平衡
比起 B 树,B+ 树把数据存在叶子结点,所有分支结点为索引,所以 B+ 树的结点要小的多,同时由于磁盘 IO 一次读出数据量是固定的,单位结点小了,那么整体 IO 次数也会更少;而且由于只在叶子结点存储数据,那么只需查找索引后在比较小的区间内查找值,查找更加高效了
比起红黑树,B+ 树的高度要矮的多,那么使用 B+ 树当索引时,它是存放在磁盘上的,如此对 B+ 树索引查找,IO 次数会比红黑树少的多
利用磁盘预读原理:一个结点大小设置为一个页大小,一次 IO 既可读出一个结点;因为磁盘预读的速度代价小的多,所以每次这样设置页大小,能使得数据相邻结点预先载入
聚簇索引与非聚簇索引:B+ 树实现的索引,分为主索引与辅助索引
- 对于 InnoDB,主索引属于聚簇索引,辅助索引属于非聚簇索引
- 对于 MyISAM,无论是哪种索引都属于非聚簇索引
两种索引区别就是,聚簇索引将数据直接存储再索引中(叶子结点的 data 域)这样会大大减少 IO 次数
2. 哈希索引原理
O(1) 时间的查找,但失去了有序性,同时无法做到 B+ 树那样的部分查找和范围查找
InnoDB 有一个特性叫“自适应哈希索引”,当某个索引值呗频繁使用,就会在 B+ 树上再建立一个哈希索引