组合索引 --最左前缀原则

组合索引 --最左前缀原则

前言:做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在这里插入图片描述

分析上图可知:
key:null 表示没有使用索引
rows:11 表示执行sql查找了11条数据才获得需要的数据(表一共有11条数据)

综上所述:那么多贴图,看的眼睛乱(还有几张没贴,估计也没人细看,结论给出来了)。自己去玩一下就明白了。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值