MyISAM索引
MylSAM的索引与记录是分开存储的,叫做非聚集索引
其主键索引与普通索引没有本质差别:
- 有连续聚集的区域单独存储行记录
- 主键索引的叶子节点存储主键与对应行记录的指针
- 普通索引的叶子节点存储索引列与对应行记录的指针
主键索引与普通索引是两颗独立的索引B+树,通过索引列查找时,先定位到B+树的叶子节点,在通过指针定位到行记录。
举例:
建一张表table(id(主键索引),name(普通索引),sex)
表记录
(1,sj,w)
(3,zs,w)
(5,li,w)
(9,wg,w)
行记录单独存储
InnoDB索引
InnoDB的主键索引与行记录是存储在一起的,所以叫做聚集索引
-
没有单独区域存储行记录
-
主键索引的叶子节点存储主键和对应行记录
-
InnoDB的表必须要有聚集索引
-
如果表定义了PK,则PK就是聚集索引
-
如果表没有定义PK,则第一个非空unique是聚集索引
-
否则,InnoDB会创建一个隐藏的row-id作为聚集索引
-
InnoDB的普通索引可以有多个
-
普通索引的叶子结点存储主键
对于InnoDB表,这里的启示是:
(1)不建议使用较长的列做主键,例如char(64),因为所有的普通索引都会存储主键,会导致普通索引过于庞大;
(2)建议使用趋势递增
的key做主键,由于数据行与索引一体,这样不至于插入记录时,有大量索引分裂,行记录移动;
select * from table where name=‘li’;
总结:
- MyISAM的索引与数据分开存储
- MyISAM的索引叶子存储行记录指针,主键索引与普通索引无太大区别
- InnoDB的聚集索引和数据行统一存储
- 聚集索引叶子节点存储数据本身,普通索引存储主键
- InnoDB一定有且只有一个聚集索引