关于MySQL组合索引你必须要知道的知识点

背景

在面试时,我经常会问面试者对MySQL掌握的熟练程度。大多数给我的回答是,用MySQL只限于增删改查。

MySQL作为关系型数据库就是用来增删改查的。普通的数据开发、数据分析师只要掌握增删改查就够了。但不要以为增删改查很容易,如果你认为是,那只能说明你浅懂。

从MySQL表中查数据是最广泛的应用。但当继续问面试者关于索引优化、组合索引的问题时,能回答到位的就很少了。如果不了解MySQL的索引,那你就不会MySQL的查,只能说是会写SQL查询语句。

本文就带你了解MySQL中常被忽略,但很重要的一种索引——组合索引

知识点1:什么是组合索引

组合索引,是在按一定顺序的多个字段上创建的索引。多个字段的排序不同,索引的使用不同。即 index_name (a, b)和 index_name2 (b, a)是不同的索引。

组合唯一索引也遵循组合索引的使用规则

知识点2:组合索引的使用规则-最佳左匹配规则

举例说明,假设有如下一个MySQL表:

create table tb_person_info (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '自增主键',
`name` varchar(255) NOT NULL COMMENT '姓名',
`age` int DEFAULT '0' COMMENT '年龄',
`birthday` date DEFAULT NULL COMMENT '出生日期',
`sex` varchar(10) DEFAULT NULL COMMENT '性别',
`id_card` char(18) DEFAULT NULL COMMENT '身份证号',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '入库时间',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间',
PRIMARY KEY (`id`),
KEY `idx_name_age_card` (`name`, `age`, `id_card`),
KEY `idx_id_card` (`id_card`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='人员信息';

在该表上有创建三个索引,分别是:

  • 主键索引id
  • 组合索引idx_name_age_card
  • 普通索引idx_id_card

下面展示一些SQL语句,并标明是否用到索引,以及用到了哪个索引


# 用到索引idx_name_age_carcd
select * from tb_person_info where name = '张伟';
# 没有用到索引
select * from tb_person_info where age = 25;
# 用到索引idx_id_card
select * from tb_person_info where id_card like '4110812022%';
# 用到索引idx_name_age_card
select * from tb_person_info where name = '张伟' and age = 25;
# 用到索引idx_name_age_card
select * from tb_person_info where name = '张伟' and id_card like '411081%';
# 用到索引idx_id_card
select * from tb_person_info where age = 25 and id_card like '411081%';
# 用到索引idx_name_age_card
select age, id_card from tb_person_info where age = 25 and id_card like '411081%';

总结以上SQL语句可以得到一下结论:

  • 查询字段有组合索引之外的字段时,查询条件必须包含组合索引中的第一个字段,才会用到该索引

  • 查询字段只限于组合索引内的字段时,查询条件只要有组合索引中的字段,就会用到该索引

知识点3:使用explain关键字分析SQL语句索引使用情况

在SQL语句前面加上explain关键字再执行,可以分析SQL语句的索引使用情况、可以用到的索引、要扫描的行数等。

在执行加上explain关键字的SQL语句时,并不会进行查表操作,只是对SQL语句进行分析

例如执行如下SQL语句:

explain select age, id_card from test.tb_person_info where age = 25 and id_card like '411081%';

得到结果:

在这里插入图片描述

最后

掌握了以上知识点,在建MySQL表时,可以根据所建表的实际查询场景对表的索引进行优化;也可以在进行查询操作时合理利用索引,从而更有效的返回结果。

另外,在建组合索引时经常会犯一个错误:重复创建索引。具体的是对组合索引的第一个字段再单独创建索引。由上述知识点2我们可以知道,组合索引的第一个字段一定是有索引的,而其他字段是没有索引的。重复创建索引不但没有必要,还会占用磁盘空间,切记不要犯这种错误!

附:
在这里插入图片描述

微信搜索公众号:追光的鲲 ,获取最新文章

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

追光的鲲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值