MYSQL进阶-索引的组合索引

回城传送–》《100天精通MYSQL从入门到就业》

一、练习题目

题目链接 难度
SQL进阶-索引的组合索引 ★★★☆☆

二、SQL思路

SQL进阶-索引的组合索引

在这里插入图片描述
在这里插入图片描述

初始化数据

drop table if exists user_profile;
CREATE TABLE `user_profile` (
`id` int NOT NULL,
`device_id` int NOT NULL,
`gender` varchar(14) NOT NULL,
`age` int ,
`university` varchar(32) NOT NULL,
`province` varchar(32)  NOT NULL);
INSERT INTO user_profile VALUES(1,2138,'male',21,'北京大学','BeiJing');
INSERT INTO user_profile VALUES(2,3214,'male',null,'复旦大学','Shanghai');
INSERT INTO user_profile VALUES(3,6543,'female',20,'北京大学','BeiJing');
INSERT INTO user_profile VALUES(4,2315,'female',23,'浙江大学','ZheJiang');
INSERT INTO user_profile VALUES(5,5432,'male',25,'山东大学','Shandong');

解法

要求处理:

  • 选出正确答案

分析:

什么是组合索引

组合索引是创建索引时,包含表的多个字段(至少2个字段),且字段会有先后顺序,mysql支持索引的最左原则。
还记得前面虚竹哥传授的索引失效口诀吗?再啰嗦一遍:模型数或运最快
其中的 代表当查询条件有组合索引时,如果不符合索引的最左原则,索引会失效。

为什么要使用组合索引

  • 减少开销:创建一个组合索引(a,b,c) ,相当于创建了(a),(a,b),(a,c),(a,b,c) 四个索引。每多一个索引,都会增加写操作的开销和磁盘空间的开销。对于大量数据的表,使用组合索引会大大的减少开销!

  • 覆盖索引:创建一个组合索引(a,b,c) ,相当于创建了(a),(a,b),(a,c),(a,b,c) 四个索引。对索引列的覆盖面就扩大了,可直接通过组合索引命中数据,减少io操作。

  • 效率高:索引列越多,通过索引筛选出的数据越少。有1000W条数据的表,有如下sql:select from table where col1=1 and col2=2 and col3=3,假设假设每个条件可以筛选出10%的数据,如果只有单值索引,那么通过该索引能筛选出1000W10%=100w条数据,然后再回表从100w条数据中找到符合col2=2 and col3= 3的数据,然后再排序,再分页;如果是联合索引,通过索引筛选出1000w10% 10% *10%=1w,效率提升可想而知!

如何使用组合索引

创建组合索引:

  • 使用CREATE INDEX 创建组合索引:

CREATE INDEX idx_university_province_age ON user_profile(university,province,age);

  • 使用 ALTER TABLE 创建普通索引:

ALTER TABLE user_profile ADD INDEX idx_university_province_age(university,province,age);

mysql创建组合索引时,会遵循索引的最左原则。最左优先:组合索引的第一个字段一定要出现在查询条件中,这个组合索引才会生效。
示例:

explain select *
from user_profile
where university='北京大学'
and age = 20
and province='BeiJing'

在这里插入图片描述
不生效示例:

explain select *
from user_profile
where age = 20
and province='BeiJing'

在这里插入图片描述
创建一个组合索引(a,b,c) ,相当于创建了(a),(a,b),(a,c),(a,b,c) 四个索引,实战验证
示例:
创建一个组合索引(a,b,c) ,相当于创建了(a)索引

explain select *
from user_profile
where university='北京大学'

在这里插入图片描述

创建一个组合索引(a,b,c) ,相当于创建了(a,b)索引

explain select *
from user_profile
where university='北京大学'
and province='BeiJing'

在这里插入图片描述

创建一个组合索引(a,b,c) ,相当于创建了(a,c)索引

explain select *
from user_profile
where university='北京大学'
and age = 20

在这里插入图片描述

创建一个组合索引(a,b,c) ,相当于创建了(a,b,c)索引,组合索引的字段在查询条件里顺序是任意的。

explain select *
from user_profile
where age = 20
and  university='北京大学'
and province='BeiJing'

在这里插入图片描述

答案

嗯,这题的答案选。。评论区大声告诉虚竹哥。

参考:

组合索引的最左优先原则

我是虚竹哥,我们明天见~

猜你喜欢

转载自blog.csdn.net/shi_hong_fei_hei/article/details/131547947