目录
聚簇索引和非聚簇索引
聚簇索引
介绍
示例
查看当前的数据库数据目录
表文件
非聚簇索引
介绍
myisam
示例
普通(辅助)索引
引入(回表查询)
mysql索引结构详细介绍 -- mysql索引 -- 索引的硬件理解(磁盘,磁盘与系统),软件理解(mysql,与系统io,buffer pool),索引结构介绍和理解(page内部,page之间,为什么是b+树)-CSDN博客
聚簇索引和非聚簇索引
聚簇索引
介绍
将用户数据与索引数据放在一起的索引方案
示例
查看当前的数据库数据目录
show variables like 'datadir';
然后我们可以在linux下进入该目录,会发现我们所有创建的数据库在里面以目录文件形式存在:
进入某个目录,里面包含了该数据库中所有表相关数据:
表文件
使用innodb存储引擎建表后,linux下会有两个对应文件被创建出来:
.frm
- 保存表结构数据
.idb
- 保存索引结构和表文件数据
- 这样就可以证明,使用innodb存储引擎时,会将数据和索引结构放在一起,而这就是聚簇索引的定义
非聚簇索引
介绍
将用户数据与索引数据分离的索引方案
myisam
myisam存储引擎的索引结构也使用b+树,但和innodb中的不同
innodb是将数据和b+树放在一块,整体作为索引结构:
而myisam是单独将b+树拎出来作为索引结构,然后在叶子结点内存放指向数据的指针:
- 所以,它比innodb中的查找过程多一步,通过找到的数据指针,找到数据
示例
使用myisam存储引擎建表后,会创建三个文件:
.frm
- 表结构数据
.MYD
- 表数据
.MYI
- 索引结构
这样就可以证明,使用myisam存储引擎时,会将数据和索引结构分开存放,而这就是非聚簇索引的定义
普通(辅助)索引
引入(回表查询)
之前我们看到的,都是以主键建立的索引结构,也可以以其他列作为键值创建索引(也就是b+树):
在innodb中建立的辅助索引,如果仍按照聚簇索引方式创建,就也会在叶子结点中存放表数据
- 那么,相当于一份数据在多个b+树中存放了多份
- 没这个必要
- 所以,辅助索引中的叶子结点只会存放该行数据对应的key值(主键键值),然后根据这个key值,去主键索引中查找相应数据
- 以上过程被称为回表查询
在myisam中,以两种键值创建的b+树没啥区别
- 因为myisam将数据和b+树分开,索引结构存放的是数据的地址,不会出现数据重复存放的问题,所以没有区别