MyISAM索引原理
MyISAM的索引文件仅保存数据记录的地址
主键索引和二级索引结构上没有任何区别,只是主键索引要求Key是唯一的,而二级索引Key可以重复。
MyISAM 和 InnoDB对比
MyISAM的索引方式都是"非聚簇"的,与InnoDB包含一个聚簇索引不同
- 在InnoDB存储引擎中,我们只需要根据主键值对
聚簇索引
进行一次查找就能找到对应记录,而在MyISAM
中却需要一次回表
这就意味着MyISAM
建立的索引全部都是二级索引
。 - InnoDB的数据文件本身就是索引文件,MyISAM索引文件和数据文件是分离的,索引仅保存记录的地址。
- InnoDB的非聚簇索引data域存储相应记录
主键的值
,而MyISAM索引记录的是地址。 - MyISAM的回表很快,以为拿着地址偏移量可以直接取到数据。而InnoDB使用主键回表。
优化逻辑
- 知道了InnoDB索引实现后,就很容易明白
为什么不建议使用过长的字段作为主键
。因为所有二级索引都引用主键索引,过长的主键索引会令二级索引变的过大。 - 用非单调的字段作为主键在InnoDB中不是个好主意,在插入新记录时,数据为了维持 B+Tree的特性而频繁分裂调整,十分低效而
自增字段作为主键是一个好的选择
索引的代价
- 空间上的代价
- 每建立一个索引都要建立一颗B+Tree,每个节点都是一个数据页,一个页默认会占用16kb的空间。
- 时间上的代价
- 对表中数据进行
增删改
操作时,都需要去需改各个B+Tree索引。需要进行记录位移
,页面分裂
,页面回收
等操作来维持 B+Tree。
裂,
页面回收`等操作来维持 B+Tree。
- 对表中数据进行