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 主键索引是聚集索引
1、非聚集索引
非聚集索引的叶子节点为索引节点,但是有一个指针指向数据节点。
MyISAM是非聚集索引。
2、聚集索引
聚集索引叶子节点就是数据节点。
关于聚集索引,innodb会按照如下规则进行处理:
1,如果一个主键被定义了,那么这个主键就是作为聚集索引
2,如果没有主键被定义,那么该表的第一个唯一非空索引被作为聚集索引
3,如果没有主键也没有合适的唯一索引,那么innodb内部会生成一个隐藏的主键作为聚集索引,这个隐藏的主键是一个6个字节的列,改列的值会随着数据的插入自增。
innodb的普通索引,唯一索引,联合索引都是辅助索引,采用非聚集索引结构。InnoDB的所有辅助索引都引用主键作为data域。
聚集索引这种实现方式使得按主键的搜索十分高效,但是辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。