MyISAM
MySQL数据以文件形式存放在磁盘,对于MyISAM引擎,每张表由三个文件组成。
- table.frm:存储表的结构。(frame)
- table.MYD:存储表的数据。(data)
- table.MYI:存储表的索引。(index)
MyISAM索引文件和数据文件是分离的(非聚集)
![](https://img.haomeiwen.com/i3630507/d6ab5365a764b40e.png)
如上图,B+树的叶子节点存储的值是磁盘地址,根据磁盘地址到MYD文件去获取数据。
InnoDB
对于InnoDB引擎,每张表由两个文件组成。
- table.frm:存储表的结构。(frame)
- table.ibd:存储表的索引和数据。(index和data)
InnoDB索引文件和数据文件是聚集的
聚集索引
![](https://img.haomeiwen.com/i3630507/a4181ff814ed6a4b.png)
- 表数据文件本身就是按B+树组织的一个索引结构文件。
- 聚集索引 - 叶节点包含了完整的数据记录,每个表有且只有一个聚集索引(主键索引),如果建表的时候没有指定主键,MySQL会自动维护一个唯一的隐藏列,以建立聚集索引B+树。所以InnoDB表必须建立主键,并且推荐使用自增的整型主键。
非聚集索引
对于非聚集索引(索引和数据是分离的),叶节点存储的是索引所在行记录的主键,所以根据非聚集索引查找到主键后,需要回表再查找主键的行记录。 只存储主键值,可以保持一致性和减少存储空间。
![](https://img.haomeiwen.com/i3630507/61419087994386a5.png)
联合索引
![](https://img.haomeiwen.com/i3630507/90b79592a2487cd9.png)
例如有三个字段name,age,position组成联合索引,MySQL会根据字段出现先后顺序依次排序,例如先按name排序,name相同再按age排序,根据这个原理,可以应用最左前缀原则优化。
网友评论