看高性能Mysql一书简单总结下引擎区别及B+Tree等索引数据结构及底层原理
1. MySQL常见引擎
InnodbMyisam- Memory
- MaraiDB
| 区别 | Innodb | Myisam |
|---|---|---|
| 存储文件(data目录) | .frm 表定义文件 | idb 数据文件 |
| .frm 表定义文件 | .myd 数据文件 | .myi 索引文件 |
| 锁 | 表锁、行锁 |
表锁 |
| 事务 | ACID | 无 |
| CRDU | 插入、修改、删除 | 读 |
| Count | 扫表 | 专门存储行数 |
| 存储 | B+Tree | B+Tree |
2. 底层数据、索引存储结构
- 数据始终存在硬盘上,传统IO机械运动需要找到存储所在对应的
柱面、扇区、磁道,最大可能100ms - 操作系统使用IO优化
页缓存,将连续的一个Page数据读取进入内存备用
page=4查找到16只需要4次磁盘IO
B+Tree
- 数据是存储在叶子结点
- 数据节点之间有指针指向
度:针对一个节点,有几个子女这个节点的度数就是几
高度:从根到叶最长的距离就叫高度
一个B+Tree的高度=磁盘IO的次数,即上图的磁盘IO次数需要3次;可以分析出只需要降低树的高度=减小磁盘IO次数
降低高度后查询所有值得IO次数都为2次
索引
上面的表格中已经知道Myisam存储的文件是将数据文件、索引文件分开存储的,索引文件中仅存的是数据文件的地址
而普通索引则是单独的一份文件,索引结构中仅保存主键的ID,通过ID再去聚簇索引中查询对应的记录(非聚簇索引)
为什么使用UUID会严重影响性能?
索引查找慢、存储量大、插入删除旋转树非常损耗非常大。所以使用自增主键ID


