组合索引 --最左前缀原则
前言:做java开发4年了,说来惭愧,很多东西都是一知半解
最近做了个0 -->1的项目,在优化sql的时候,才发现自己对组合索引的认识很迷糊。
所以记录下这个知识点, 以作备忘录。
一:什么是组合索引
一般来说,都会给表加上索引,用以优化查询效率。
如:select * from user where sex = 1; 可以建立个索引:sex(普通索引)。
如:select * from user where sex = 1 and age = 22; 可以建立一个索引:sex ,age(组合索引)。
由此可见:组合索引就是:索引大于一个字段,且多个字段排序不同,是不同的索引。
二:什么是最左前缀原则
比如说:创建一个组合索引 {a,b,c}。
等同于创建了三个索引:{a} , {a,b} , {a,b,c}
这里必须说下我之前迷糊的地方:
我之前以为:组合索引 {a,b,c} ,相当于创建了 {a} , {b} , {c} , {b,c} , {a,b,c}。
三:SQL中使用索引来证明最左前缀原则
贴个建表语句,组合索引:(del_flag
,sex
,age
)
CREATE TABLE `user` (
`id` bigint NOT NULL,
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '姓名',
`age` int DEFAULT NULL COMMENT '年龄',
`sex` tinyint(1) DEFAULT NULL COMMENT '性别:0-女,1-男',
`del_flag` tinyint(1) DEFAULT '0' COMMENT '是否删除:0-否,1-是',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `idx_1` (`del_flag`,`sex`,`age`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
3.1 解释:select * from user
ps:解释结果中有12个字段,可以百度查询下: Mysql Explain
分析上图可知:
key:null 表示没有使用索引
rows:11 表示执行sql查找了11条数据才获得需要的数据(表一共有11条数据)
3.2 解释:select * from user where del_flag = 0
分析上图可知:
key:idx_1 表示使用索引idx_1
rows:6 表示执行sql查找了6条数据才获得需要的数据(表一共有11条数据)
3.3 解释:select * from user where del_flag = 0
分析上图可知:
key:null 表示没有使用索引
rows:11 表示执行sql查找了11条数据才获得需要的数据(表一共有11条数据)
3.4 解释:select * from user where sex = 0 and age = 18![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/b2604e68baafcbc63cf7220904e065b3.png)
分析上图可知:
key:null 表示没有使用索引
rows:11 表示执行sql查找了11条数据才获得需要的数据(表一共有11条数据)
综上所述:那么多贴图,看的眼睛乱(还有几张没贴,估计也没人细看,结论给出来了)。自己去玩一下就明白了。