MySQL的一级索引和二级索引介绍
1、一级索引
索引和数据存储在一起,都存储在同一个B+tree中的叶子节点。一般主键索引都是一级索引。
2、二级索引
二级索引树的叶子节点存储的是主键而不是数据。也就是说,在找到索引后,得到对应的主键,再回到一级索引中找主键对应的数据记录。
3、例子介绍
下面我们通过一个具体的示例进行演示一级索引和二级索引。有如下表pl_ranking(编程语言排行榜表),该表包含3个字段,如下:
id:主键
plname:编程语言名称
ranking:排名
- 1
- 2
- 3
3.1 主键索引结构
从图中我们可以看到,索引和数据都在一颗树的叶子节点,是存在一起的。通过定位索引就直接可以查找到数据。如果查找id=16的编程语言
select id, plname, ranking from pl_ranking where id=16;
则只需要读取3个磁盘块,就可以获取到数据。
3.2 非主键索引结构
如果根据字段plname创建索引,B+树结构如下:
从上图中我们发现,该B+tree根据plname列进行构建的,只存储一级索引数据。比如,查找编程语言为“Java”的数据
select id, plname, ranking from pl_ranking where plname=‘Java’;
首先通过二级索引树中找到Java对应的主键id为 “16”(读取2个磁盘块)。然后在去主键索引中查找id为“16” 的数据(读取3个磁盘块)。
3.3 一级索引和二级索引的关系:回表
一级索引可以单独存在,二级索引不能单独存在,必须依附于一级索引,这叫做“回表”。
4.0 二级索引存储主键值而不是存储数据优缺点
优点:
##########sample 2
聚簇索引和二级索引介绍
其中 聚簇索引 对应着主键索引和一级索引。
其中 二级索引 对应着普通索引。
前言
本篇文章主要介绍聚簇索引和二级索引的区别,以及从存储结构出发怎样更有效地优化SQL。
一、索引介绍
1.目的
更快地查询到想要的数据
2.实现方式
在写数据(增、删、改)时动态维护指定的数据结构,每个数据结构都是一个索引;查询时根据某个数据结构来查询。
3.举个栗子
一本3000页的《三国演义》对应数据库的一张表,目录对应索引,内容对应表中的数据。
想要查看第21章的内容,不使用索引时,最坏的情况可能需要翻3000页。使用索引的话,只需翻开书的目录(目录可能占据5页),然后发现第21章在1689页,进而直接翻开1689页即可。
二、索引创建与查询
创建一张表,并插入5条数据
CREATE TABLE `person` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`age` int DEFAULT NULL,
PRIMARY KEY (`id`)
);
INSERT INTO `person`(`id`, `name`, `age`) VALUES (1, 'Jack', 12);
INSERT INTO `person`(`id`, `name`, `age`) VALUES (2, 'Bob', 13);
INSERT INTO `person`(`id`, `name`, `age`) VALUES (3, 'Jession', 11);
INSERT INTO `person`(`id`, `name`, `age`) VALUES (4, 'Lisa', 14);
INSERT INTO `person`(`id`, `name`, `age`) VALUES (5, 'Haro', 16);
1. 聚簇索引
每张表都有对应的聚簇索引,MySQL优先按主键建立聚簇索引;如果你没有指定主键,使用唯一键;如果连唯一键也没有,mysql会自动建一个rowid字段,用它来组织这棵 B+树
按主键建立聚簇索引,存储结构如图所示:
聚簇索引的叶子节点包含数据行,id大于3的数据放在右边,小于3的数据放在左边。
如果各位想了解这棵树是怎么构造起来的,可以参考构造B+树网站,自己手动构造下。
查询
select * from person where id = 5;
1
此时MySQL就会使用聚簇索引查询,依次查询到3-4-5,此时就能直接获取到id=5的数据。
2. 二级索引
-- 创建普通索引
CREATE INDEX idx_name ON person (name);
创建二级索引,存储结构如图所示:
可以看到,二级索引的叶子节点存储的是主键值。
查询
select * from person where name = 'Jack';
1
这样的查询会经过两个步骤,
1. 先在二级索引的B+树中查到Jack对应的主键id值为1;
2. 然后拿主键id值,去聚簇索引中查询真正的数据。
三、SQL优化思路
1. 磁盘
不要建立太多索引,这样会建立很多B+树,很占磁盘容量。
一个索引中的字段不要太多,否则树中的每个节点都很大。
2. 写操作
尽量少创建无用的索引。因为每个写操作执行时,都会更新所有索引对应的B+树。
3. 查询
尽量不要使用select * 。如果select 后面的字段都是二级索引中的字段,MySQL就不会再去聚簇索引中查找完整数据了。
四、总结
聚簇索引
B+树的数据结构,叶子节点包含完整的数据行。
每张表都有自己的聚簇索引。
二级索引
B+树的数据结构,叶子节点仅包含数据的主键。
用户每创建一个索引,就会生成一颗B+树。
使用二级索引查询完整数据行时,会执行两个步骤:先查二级索引,然后再查聚簇索引。
————————————————
版权声明:本文为CSDN博主「Bronze5」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Bronze5/article/details/107792063