索引和数据存储在一块( 都存储在同一个B*tree 中)。 一般主键索引都是聚餐索引
Mysql中InnoDB引擎的主键索引为聚簇索引,MyISAM存储引擎采用非聚集索引
索引数据和存储数据是分离的。
二级索引存储的是记录的主键,而不是数据存储的地址。
以Mysql的InnoDB为例 主键是聚集索引 唯一索引、普通索引、前缀索引等都是二级索引(辅助索引)
下面我们通过一个具体的示例进行演示聚集索引和二级索引
该表包含3个字段,如下: id:主键 plname:编程语言名称 ranking:排名
idplnameranking15C216Java118Php623C#526C++329Ada1750Go1252Lisp15………id: 设置主键 plname: 普通索引
从图中我们可以看到,索引数据和存储数据都是在一颗树上,存在一起的。通过定位索引就直接可以查找到数据。
这棵树是根据主键进行创建的。 如果查找id=16的编程语言, select id, plname, ranking from pl_ranking where id=16; 则只需要读取3个磁盘块,就可以获取到数据。
从上图中我们发现,该B*tree根据plname列进行构建的,只存储索引数据,plname 和 id 的映射。
比如查找 编程语言为“Java”的数据。 select id, plname, ranking from pl_ranking where plname=’Java’; 首先通过二级索引树中找到 Java 对应的主键id 为 “16”(读取2个磁盘块)。 然后在去主键索引中查找id为“16” 的数据。(读取3个磁盘块)
select id, plname, ranking from pl_ranking where id=16; 根据主键查找只需要查找3个磁盘块 select id, plname, ranking from pl_ranking where plname=’Java’; 根据编程语言名称查询需要读取5个磁盘块
通过上面的主键索引和非主键索引的例子我们可以得出: 主键索引(聚餐索引)查询效率比非主键索引查询效率更高。如果能使用主键查找的,就尽量使用主键索引进行查找。
从上面图中我们还可以分析得出以下结论: 主键定义的长度越小,二级索引的大小就越小,这样每个磁盘块存储的索引数据越多,查询效率就越高。
附:
每个InnoDB表具有一个特殊的索引称为聚簇索引(也叫聚集索引,聚类索引,簇集索引)。如果表上定义有主键,该主键索引就是聚簇索引。如果未定义主键,MySQL取第一个唯一索引(unique)而且只含非空列(NOT NULL)作为主键,InnoDB使用它作为聚簇索引。如果没有这样的列,InnoDB就自己产生一个这样的ID值,它有六个字节,而且是隐藏的,使其作为聚簇索引。
表中的聚簇索引(clustered index )就是一级索引,除此之外,表上的其他非聚簇索引都是二级索引,又叫辅助索引(secondary indexes)
