前面我们讲解了索引的存储结构,B+Tree的索引结构,我们一般都知道Mysql的存储引擎有两种,MyISAM和InnoDB,今天我们来详细讲解下Mysql的存储引擎
MyISAM会把数据存储在磁盘上,分别存储成3个文件,其中文件名和表名都相同,但是扩展名分别为:
MyISAM的索引的索引和数据是分开存储的,他的结构是B+Tree, 在Tree的叶子节点的数据区域存储的是实际数据的地址,指向实际的地址,这种索引就是非聚集索引

InnoDB会把数据存储在磁盘上,分别存储成2个文件
它和MyISAM很大的区别就是InnoDB的数据文件本身就是索引文件,索引和数据是放在一起的,只有一个文件idb文件后缀结尾
InnoDB的索引结构也是B+Tree结构,但是Tree的叶子节点保存的就是完整的数据记录,索引的Key就是表的主键,数据文件本身就是主索引,这就要求表结构必须有主键,即使没有显式的设置主键也会默认生成一个隐式主键
数据和索引在一起,叶子节点包含了完整的数据记录,这种索引就叫做聚集索引

| 对比 | InnoDB引擎 | MyISAM引擎 |
|---|---|---|
| 文件存储方式 | .frm 后缀是表定义文件,ibd(数据和索引文件一起) | .frm后缀是表定义文件,.MYD是数据文件,.MYI是索引文件 |
| 索引方式 | B+Tree | B+Tree |
| 辅助索引data区域 | Tree的数据区域data存储的是索引主键的值,所以需要靠辅助索引获得主键,然后用主键到主索引中检索获得记录,也就是回表 | Tree的数据区域data存储的是索引地址 |
| 事务支持 | 支持事务ACID | 不支持事务 |
| 锁机制 | 表级锁,行级锁 | 表级锁 |
| count(*)查询 | 全表扫描 | MyISAM表级锁直接存储了表行数,count(*)直接读取,无所扫描 |
| 读效率 | 效率低 | 效率高 |
| 写效率 | 效率高 | 效率低 |
| 常用场景 | 读写操作 | 读操作,读多写少 |
经常听到别人说Mysql的索引树一般会在3层,这个是有什么依据?为什么说Mysql的索引树一般都在1-3层的结构?
下面我们来具体的计算一下,看看3层结构可以支持多少数据
那么三层的树,我们可以存放 1170 * 1170 * 16 = 21,902,400 = 2KW 两千万条数据,只需要3次I/O操作,我们就可以精确定位数据
所以我们的表数据一般而言都保持在千万级以内,索引树都会保持在3层之内,因此Mysql的索引树一般都在1-3层。
至此,我们彻底的了解了mysql存储引擎的分类及区别,也深入探讨了索引树一般会在3层的底层逻辑