1)什么是联合索引?

联合索引指的是对一张表上的多个列进行索引。也就是说,表上多个列加起来组成一个索引,供快速查询使用。

2)如何使用联合索引?

首先,给表添加索引
创建表时给表添加:

CREATE TABLE t(a int,b int,primary key(a),key idx_a_b(a,b)
)

创建表后给表添加:

CREATE TABLE t(a int,b int,primary key(a)
)

给表添加索引语句:

ALTER TABLE t ADD INDEX indx_a_b(a,b);

然后进行使用该联合索引进行查询,在此之前,我们需要学习联合索引的最左前缀原则。
最左前缀原则规定了联合索引在何种查询中才能生效,规则如下:
如果想使用联合索引,联合索引的最左边的列必须作为过滤条件,否则联合索引不会生效。
这也就是说,联合索引其实拥有单列索引的作用。
下面我们给上表t插入数据,学习联合索引如何正确使用:

insert into t(a,b) values(1,4);
insert into t(a,b) values(2,5);
insert into t(a,b) values(3,6);

最左前缀原则实验:


3)联合索引使用场景

那么联合索引的优势在哪里呢?

首先,我们需要看一下联合索引内部的结果:从本质上说,联合索引还是一个B+树,不过联合索引的键值数量不是1,
而是大于等于2. 我们一个两列联合索引假定两个键值分别为key1,key2,则其B+树结构如下图:

从上图中我们可以看到,通过叶子节点可以逻辑上顺序地读出,所有数据:
(1,2) (1,2) (2,1) (2,4) (3,1) (3,2).
因此,对于查询

SELECT * FROM TABLE WHERE key1=xxx and key2=xxx 显然是可以使用(key1,key2)这个联合索引的。
对于单个列key1的查询 `SELECT * FROM TABLE WHERE key1=xxx` 根据最左前缀原则也是可以使用联合索引的。

但是:对于单个列key2的查询时不可以使用B+树索引的:

SELECT * FROM TABLE WHERE key2=xxx;

我们查看上图B+树可以看到叶子节点上的key2的值为1,2,1,4,1,2,这显然不是顺序的,故对于key2列的查询是不能使用联合索引的。

综上,我们可以总结出联合索引的一个优势:当两个列的组合是唯一值时,联合索引是个不错的选择。

联合索引的另一个好处就是可以对第二个键值进行排序

例如,在很多时候我们需要查询某个用户的购物情况,并按照时间排序。这时使用联合索引(userid,buy_date)可以减少一次排序操作,因为这个索引本身在叶子节点上已经排序了。
实例:
首先创建一张表

CREATE TABLE buy_log(userid int unsigned not null,buy_date DATE
)

然后给表加上一个两个索引:

ALTER TABLE buy_log ADD KEY (userid);
ALTER TABLE buy_log ADD KEY(userid,buy_date);

最后向表中插入数据:

INSERT INTO buy_log (userid,buy_date) VALUES (1,'2021-01-01');
INSERT INTO buy_log (userid,buy_date) VALUES (2,'2021-01-01');
INSERT INTO buy_log (userid,buy_date) VALUES (3,'2021-01-01');
INSERT INTO buy_log (userid,buy_date) VALUES (1,'2021-02-01');
INSERT INTO buy_log (userid,buy_date) VALUES (3,'2021-02-01');
INSERT INTO buy_log (userid,buy_date) VALUES (1,'2021-03-01');

这时联合索引的B+树结构如下:

本例中创建了两个索引来进行比较,一个是userid的单列索引,一个是userid和buy_date的联合索引。
如果只对userid进行查询,例如:

EXPLAIN SELECT * FROM buy_log WHERE userid=2;

可以看到,优化器最终选择的是userid,从这里可以看出,查询一行数据时,当单列和索引和联合索引发生冲突时,优先选择单列索引。

接着,假定要取出userid为1的最近3次的购买记录:

EXPLAIN SELECT * FROM buy_log WHERE userid=1 ORDER BY buy_date DESC LIMIT 3;


从这里可以看到优化器选择了联合索引,下面我们看下这个查询的结果:

上面说到联合索引的一个优势就是:可以对第二个键值进行排序
所以下面语句在不使用ORDER BY额外排序的基础上一样可以得到排序结果:

EXPLAIN SELECT * FROM buy_log WHERE userid=1 DESC LIMIT 3;


这就是使用联合索引的一个巨大的优势!!!

7.联合索引(最左前缀原则)相关推荐

  1. mysql索引最左前缀原则

    mysql索引最左前缀原则 创建索引可以大大提高系统的性能. 第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性. 第二,可以大大加快数据的检索速度,这也是创建索引的最主要的原因. 第三, ...

  2. 覆盖索引最左前缀原则索引下推

    覆盖索引 如果执行的语句是 select ID from T where k between 3 and 5,这时只需要查 ID 的值,而 ID 的值已经在 k 索引树上了,因此可以直接提供查询结果, ...

  3. 【MySQL】索引原理(三):联合索引(最左前缀原则),覆盖索引,索引条件下推

    准备工作,下面的演示都是基于user_innodb表: DROP TABLE IF EXISTS `user_innodb`; CREATE TABLE `user_innodb` (`id` big ...

  4. 索引原理:联合索引(最左前缀原则)

    准备工作,创建数据表user_innodb表 DROP TABLE IF EXISTS `user_innodb`; CREATE TABLE `user_innodb` (`id` bigint(6 ...

  5. mysql非聚集索引区间查询_mysql的聚集索引和非聚集索引,回表查询,索引覆盖,最左前缀原则略解...

    什么是聚集索引和非聚集索引 我们知道 Mysql 底层是用 B+ 树来存储索引的,且数据都存在叶子节点.对于 InnoDB 来说,它的主键索引和行记录是存储在一起的,因此叫做聚集索引(clustere ...

  6. MySQL 覆盖索引、最左前缀原则、索引下推

    1.覆盖索引 1.1 概念 索引是高效找到行的一个方法,当能通过检索索引就可以读取想要的数据,那就不需要再到数据表中读取行了.如果一个索引包含了(或覆盖了)满足查询语句中字段与条件的数据就叫做覆盖索引 ...

  7. mysql中组合索引创建的原则是什么意思_面试前必须要掌握的MySQL索引最左前缀匹配原则...

    在面试中,经常会遇到这种问题,如果我们设置联合索引的顺序是(a, b, c), 那么如果我们在查询时的顺序却是(a, c, b) 会走索引吗?这个问题被问到的频率之高,令人乍舌,在这篇文章中,我们就深 ...

  8. mysql索引优化原则:覆盖索引、最左前缀原则、索引下推

    文章目录 前言 round1:覆盖索引 round2:最左前缀原则 round3:索引下推 小结 前言 在文章开始前,小编提出几个问题,读者可以思考一下如何回答.如果对于以下的问题,回答的模棱两可甚至 ...

  9. 《MySQL实战45讲》——学习笔记04-05 “深入浅出索引、最左前缀原则、索引下推优化“

    04 | 深入浅出索引(上) 1. 什么是索引? 索引的出现其实就是为了提高数据查询的效率,就像书的目录一样,书有500页,每页存的都是书的内容,目录可能只有5页,只存了页码:通过目录能快速找到某个主 ...

最新文章

  1. wampserver2.5安装 redis缓存,igbinary, phalcon框架
  2. python中字典的常用函数_python中得字典和常用函数总结
  3. linux内核多种进程间通信机制
  4. 可以通过执行报表RSVMCRT_MINI_DEBUGGER 查看CRM IPC中定价计算公式的相关源代码
  5. 他从零开始学Python,25岁拥有480000粉丝:成功就靠这3点!
  6. 全网最通透的“闭包”认知 · 跨越语言
  7. HDU1864(01背包)
  8. 信息学奥赛一本通C++语言——1097: 画矩形
  9. 中怎么均化走线_巴黎世家老爹鞋怎么鉴定真假 辨别真假对比图了解一下
  10. 01_6_SERVLET如何从上一个页面取得参数
  11. 帆软填报报表的使用教程
  12. 可见首发《模式识别与智能计算:MATLAB技术实现(第2版)》 百度网盘 下载 分享
  13. java 实现站内信_站内信设计
  14. 浅谈垂直腔面发射激光器的设计原则
  15. c语言给图片打码,OpenCV (一):初相识:马赛克处理图片
  16. deepin外置键盘无法打开键盘背光灯的解决方法
  17. SMS发送WapPush
  18. Jodd-Java的瑞士军刀 demo
  19. TypeError: slice indices must be integers 数组索引必须是整数
  20. 周杰伦2014新专辑《哎呦,不错哦》

热门文章

  1. 【搜索+拆点】魔鬼之城
  2. 以Echo为例,从锂矿厂到数据矿厂的人工智能产业全景地图是这样的
  3. 0基础搭建视频直播服务(RTMP推流 云直播)
  4. 全国计算机三级网络工程技术复习笔记3
  5. Spring Boot Security OAuth2 入门
  6. KMP-CF535D-Tavas and Malekas
  7. 通过U盘给笔记本或台式机安装Linux系统(Ubuntu16.04)超级简单的安装步骤,十分钟就能搞定哟
  8. JS实用技巧之断点调试详解
  9. AutoMapper详解
  10. 【最火的微信开发开源框架】推荐给开发者应该学会的有关微信开发的十个开源项目