MySQL开发技巧 - 分页和索引(三)

it2026-08-26  6

@R星校长

第3关:索引(组合索引)
什么是组合索引和单列索引区别;如何创建组合索引。

什么是组合索引?

上一关卡中介绍了单列索引,很多同学可能会觉得组合索引实际上就是一个表中有多个单列索引,实际上远非看上去这么简单。

例如上节的例子中,student表有如下字段:id,name,city,score。 我们在name上和city上建立了分别的单列索引。假如这个表数据极大,我们在进行查询的时候,会有很多重名的人,比如执行以下 sql :

select * from student where name="xiaoming" and city = "北京" and score="60"

在进行查询的时候,因为有单列索引在,所以我们会先得到名字为xiaoming的一百条记录,然后在这一百条记录中查找出城市为北京的记录,最后再查找分数为60 的记录。

这样快不快?有了单列索引,不需要扫描全表,当然快!但是,这还不够,MySQL还可以为我们提供更强大的查询效率,因为以上只会使用效率最高的一个单列索引,其余字段的索引不会生效,所以这个时候就轮到了组合索引出场。

组合索引是同时包含多个字段但是只有一个索引名称,可以直接根据组合索引查询符合字段条件的记录!

例如我们建立一个name,city,core的组合索引,可以将满足条件的记录筛选到极为有限的几条,因为如果只有单列索引的话,可能索引查出来还有上万甚至更多记录,再根据后续条件挨个筛选,一步到位的组合索引明显在性能上会快上很多。

创建组合索引

那组合索引是怎么创建,创建和查询时又有什么需要注意的地方呢? 创建示例如下:

ALTER TABLE student ADD INDEX name_city_score (name,city,score);

实际上直接创建了如下三个索引:

name name city name city score

查询时也会根据查询语句以上三个索引进行匹配,即查询名字或者同时查询名字城市又或者查询名字城市分数时都可以使用组合索引,但是查询城市分数等就不能使用,这是因为遵循了最左匹配原则,必须从左开始进行匹配。

编程要求

有如下表person,在name、age、address上创建组合索引,索引名name_city_score(无需建表,只增加组合索引即可)。

表person结构如下所示:

字段类型idint(11)namevarchar(20)ageintaddressvarchar(30)

预期输出:

Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment person 0 PRIMARY 1 id A 0 NULL NULL BTREE person 1 name_city_score 1 name A 0 NULL NULL YES BTREE person 1 name_city_score 2 age A 0 NULL NULL YES BTREE person 1 name_city_score 3 address A 0 NULL NULL YES BTREE

开始你的任务吧,祝你成功!

USE Person; #请在此处添加实现代码 ########## Begin ########## #1.增加组合索引 alter table person add INDEX name_city_score(name,age,address); ########## End ########## SHOW INDEX FROM person;

最新回复(0)