1.什么是聚集索引和非聚集索引 ?(聚簇索引和非聚簇索引)
聚集还是非聚集指的是B+Tree 叶结点存的是指针还是数据记录
MyISAM索引和数据分离,使用的是非聚集索引
InnoDB数据文件就是索引文件,主键索引就是聚集索引
(1)MyISAM引擎 默认是非聚集索引
图解:在叶结点里面存储的是指向数据的指针,如叶结点5中存储的0x6A,指针指向的数据的表文件也就是数据文件,这里索引文件和数据文件是两个文件,所以说它是非聚集的。
① 非聚集索引文件存储方式
CREATE TABLE myisam_table (
`id` INTEGER PRIMARY KEY,
title VARCHAR(80)
) ENGINE = MYISAM;
# 非聚集索引,存储需要两个文件myisam_table.MYD数据文件和myisam_table.MYI索引文件
(2)InnoDB引擎主键索引是聚集索引
图解:叶结点即存储 主键 同时也存储 数据表里面的内容,如叶结点15, 存储主键34和数据Bob。
① 聚集索引件存储方式
CREATE TABLE innodb_table (
`id` INTEGER PRIMARY KEY,
`url_md5` char(32),
KEY `idx_url` (`url_md5`)
) ENGINE = InnoDB;
# 聚集索引,只有一个文件innodb_table.idb,说明数据和索引存储在同一个文件
(3)InnoDB引擎辅助索引
对于InnoDB引擎它的辅助索引,它的叶结点存储的是主键的值。然后再通过主键找到对应的数据。其实这是两个过程,这就是为什么在InnoDB引擎里面使用辅助索引要比直接使用主键索引慢一些的原因。
辅助索引先找到主键以后再根据主键找到数据
聚集和非聚集区别是在 B+Tree的叶结点存储数据还是指针 ,
MyISAM 默认使用索引是非聚集的,
InnoDB 主键索引是聚集索引