存储引擎
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+ 树上再建立一个哈希索引

京公网安备 11010502036488号