1. MySQL存储引擎、索引底层原理分析
一 Mysql 存储引擎
1. Mysql 存储引擎介绍
在MySQL5 之后, 支持的存储引擎多达十几种,如图

在这些存储引擎中,常用的也就 MyISAM、InnoDB、MEMERY三种存储引擎,其中 InnoDB 是我们最常用的也是 Mysql 默认的存储引擎
2. 各个存储引擎比较
| 功能 | MyISAM | MEMERY | InnoDB |
| 存储限制 | 256TB | RAM | 64TB |
| 支持事物 | NO | NO | YES |
| 支持全文索引 | YES | NO | NO |
| 支持B树索引 | YES | YES | YES |
| 支持Hash索引 | NO | YES | NO |
| 支持聚簇索引 | NO | NO | YES |
| 支持数据索引 | NO | YES | YES |
| 支持数据压缩 | YES | NO | NO |
| 空间使用率 | 低 | N/A | 高 |
| 支持外键 | NO | NO | YES |
| 其他 | 不支持事务操作的优势是 MyISAM 存储操作更快 | 不支持TEXT和BLOB类型,对于字符串类型的数据,只支持固定长度的行,VARCHAR会被自动存储为CHAR类型 | InnoDB是默认的存储引擎,可以通过 auto_increment 自动增长序列 |
二 索引底层原理分析:
1.1. 聚簇索引:聚簇索引InnoDB为每个表自动创建的一张索引,在InnoDB中聚簇索引就是数据的存储方式(所有的用户记录都存储在了叶子结点)。
1.2. 聚簇索引有以下特点:
a. 按主键值的大小进行记录和页的排序:
- 数据页(叶子结点)里的记录是按照主键值从小到大排序的一个单向链表。
- 数据页(叶子结点)之间也是按照主键值从小到大排序的双向链表。
- B+ 树中同一个层的页目录也是按照主键值从小到大排序的一个双向链表。
b. B+ 树的叶子结点存储的是完整的用户记录,就是指这个记录中存储了所有列的值(包括隐藏列)。
2. 二级索引(复制索引)
聚簇索引只能在搜索条件是主键值时才能发挥作用,因为B+ 树中的数据都是按照主键进行排序的。当我们想以别的列作为搜索条件时我们可以多建几颗B+ 树索引,这些索引称为二级索引。
二级索引与聚簇索引有几处不同:
- 按指定的索引列的值来排序
- 叶子结点存储的不是完整的用户记录,而只是索引列+主键
- 目录项纪录中不是主键+页号,变成了索引列+页号
- 在对二级索引进行查找数据时,需要根据主键值去聚簇索引中再查找一遍完整的用户记录,这个过程叫回表

浙公网安备 33010602011771号