MySQL索引-2聚集索引探讨
本文目录
概述
innoDB中的索引
MyISAM中的索引
总结与开发经验
概述
-
聚集索引不是一种索引类型,而是一种数据存储方式,表示数据以主键索引的顺序进行聚集存储。
-
【聚集】表示数据行和主键聚簇存储在一起,数据行在磁盘的排列和索引排序保持一致。
-
innoDB中聚集索引根据表的主键构建一个B+树来组织数据,这个树的叶子节点直接存储行数据。
不同存储引擎的索引方式不同,比如MyISAM中就没有使用聚集索引。
接下来,详细分析MySQL中innoDB与MyISAM存储引擎中数据组织形式与索引方式,从而进一步认识聚集索引的特点。
innoDB中的索引
设有如下数据表:
ID | NAME | CITY |
---|---|---|
5 | Bob | Shanghai |
8 | Lee | Beijing |
18 | Sam | Wuhan |
24 | Rose | Wuhan |
40 | Alan | Nanjing |
55 | Hobo | Chengdu |
innoDB的主键索引为聚集索引形式,示意图如下:
innoDB的主键索引中叶子节点存储的就是整个表的数据,可以说其主键索引文件与数据文件本质是同一个。
在innoDB中,这种数据按照主键进行聚集的形式,叫做聚集索引。如果没有显示指定主键索引的话,MySQL会选取有非空且唯一约束的字段作为主键,如果这种字段也不存在,则自动创建一个隐藏字段作为主键,以确保数据可以按主键进行聚集。
而在innoDB中,辅助索引叶子节点存储的是主键值,如下图:
因此可以看出,通过辅助索引进行查询时,需要走两次索引:先走辅助索引获取主键,再走主键索引获取到数据。
MyISAM中的索引
在MyISAM同样存在主键索引和辅助索引,但是这两类索引本质并无区别,其叶子节点都是存储了数据的地址。示意如下:
所以说,MyISAM中的索引是非聚集的,即数据并不按照主键进行组织和聚集。
MyISAM中索引文件是独立于数据文件的,且通过主键索引和辅助索引查询数据的过程时一样的,这一点与innoDB不同。
总结与开发经验
-
聚集索引并不是一种单独的索引类型,而是一种数据存储方式。聚集表示数据行和主键聚簇存储
在一起,数据行在磁盘的排列和索引排序保持一致。
-
InnoDB中的主键索引是聚簇索引,其他索引(辅助索引)为非聚簇索引。
-
MyISAM中不使用聚集索引。
-
聚集索引的优点:数据按照聚集索引排列顺序,当按主键进行搜索时,由于数据的聚集特点,MySQL不用频繁跨磁盘块提取数据,I/O次数减少,效率大大提高。
-
innoDB表的主键尽量选用单调字段,否则插入数据时需要调整B+树,使插入效率降低。