一次搞清楚Mysql联合索引,以及联合索引究竟用了多少

一群DBA朋友聊天,突然抛出一个某公司联合索引的面试题,当时好多人都蒙了,这次针对这个问题,做了个简单的实验,把联合索引的作用一次搞清楚

问题大概是这样的,联合索引(a,b,c,d)下面这类的查询分别用到联合索引的哪部分?

select * from t where a=1 and b=1 and d>1 and c=1;

select * from t where a=1 and b>1 and c>1 order by b,c;

select * from t where a=1 and b=1 and c=1 and d=1 order by b;

select * from t where a=1 and b>1 and d=1 order by c;

 

下面建立测试表,字段都用int not null,并插入测试数据

CREATE TABLE `NewTable` (
`id` int NOT NULL ,
`a` int NOT NULL ,
`b` int NOT NULL ,
`c` int NOT NULL ,
`d` int NOT NULL ,
PRIMARY KEY (`id`)
)
;

建立联合索引

ALTER TABLE `t`
ADD INDEX `idx_a_b_c_d` (`a`, `b`, `c`, `d`) ;

 

1.explain select * from t where a=1 and b=1 and d>1 and c=1\G;

id: 1
select_type: SIMPLE
table: t
type: range
possible_keys: idx_a_b_c_d
key: idx_a_b_c_d
key_len: 16
ref: NULL
rows: 1
Extra: Using where; Using index

key_len=16说明索引走了4个字段 4*4字节,联合索引用到全部字段

2.explain select * from t where a=1 and b>1 and c>1 order by b,c\G;

id: 1
select_type: SIMPLE
table: t
type: range
possible_keys: idx_a_b_c_d
key: idx_a_b_c_d
key_len: 8
ref: NULL
rows: 1
Extra: Using where; Using index

key_len=8 说明where过滤用了两个字段 ab, Extra没有file sort,说明排序用到全部索引bc,所以这个查询用到了索引的abc部分

3.explain select * from t where a=1 and b=1 and c=1 and d=1 order by b\G;

id: 1
select_type: SIMPLE
table: t
type: ref
possible_keys: idx_a_b_c_d
key: idx_a_b_c_d
key_len: 16
ref: const,const,const,const
rows: 3
Extra: Using index

key_len=16 说明where过滤用了4个字段abcd,Extra没出现file sort,说明排序用到了索引b。

4.explain select * from t where a=1 and b>1 and d=1 order by c\G;

id: 1
select_type: SIMPLE
table: t
type: range
possible_keys: idx_a_b_c_d
key: idx_a_b_c_d
key_len: 8
ref: NULL
rows: 1
Extra: Using where; Using index; Using filesort

key_len=8说明where过滤用到了两个字段ab, Extra出现filesort,说明排序字段没用到索引

 

这类的查询就不一一测试了,总结一下看这类执行计划应该注意的点

 

key_len

1)key_len单位是字节,比如int,一个字段是4,两个字段是8

(如果字段可以为空,那么key_len会+1,也就是int会显示5,两个字段显示10)

2)key_len显示的是where条件用到索引长度,order by 和group by之后的字段不显示在key_len里面

 

Extra

两种情况会出现file sort

1)where 条件后面没有这个字段,但是order by这个字段,会出现file sort

2)order by的字段没走索引,会出现file sort

还有比较重要的是,联合索引遇到范围查询会停止继续检索,比如where a=1 and b=1 and c>1 and d=1那么索引只会检索到abc

 

当然,排序会延续使用where条件后面的索引,比如下面的情况

 

mysql> explain select * from t where a=1 and b>1 order by b,c\G ;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: t
type: range
possible_keys: idx_a_b_c_d
key: idx_a_b_c_d
key_len: 8
ref: NULL
rows: 1
Extra: Using where; Using index

排序用到了ab,但是排序用到了bcd,也就是这整条查询用到了abcd全部联合索引

 

转载于:https://www.cnblogs.com/lv-lei/p/7055778.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/370279.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSS Variables

CSS原生变量(CSS自定义属性) 示例地址:https://github.com/ccyinghua/Css-Variables 一、css原生变量的基础用法 变量声明使用两根连词线"--"表示变量,"$color"是属于Sass的语法,"color"是属于Less的语法&a…

【基础中的基础】引用类型和值类型,以及引用传递和值传递

一直在博客园怼人,非常惭愧。所以郑重决定: 好好写一篇干货,然后再接着怼人。 这是一起帮上陈百万同学的求助,讲了一会之后,我觉得很有些普世价值,干脆就发到园子来。面向小白,高手轻拍。 我们从…

Java 7:使用NIO.2进行文件过滤–第3部分

大家好。 这是使用NIO.2系列进行文件过滤的第3部分。 对于那些尚未阅读第1 部分或第2部分的人 ,这里有个回顾。 NIO.2是自Java 7起JDK中包含的用于I / O操作的新API。使用此新API,您可以执行与java.io相同的操作,以及许多出色的功能&#xf…

python众数问题给定含有n个元素的多重集合s_分治法求众数 给定含有n个元素的多重集合S 联合开发网 - pudn.com...

分治法求众数所属分类:数据结构开发工具:C/C文件大小:240KB下载次数:3上传日期:2018-01-04 20:19:09上 传 者:九鼎说明: 给定含有n个元素的多重集合S,每个元素在S中出现的次数称为该…

mysql 5.0 乱码,解决MySQL 5.0.16的乱码问题

导读:问:怎样解决MySQL 5.0.16的乱码问题?答:MySQL 5.0.16的乱码问题可以用下面的方法解决:1.设置phpMyAdminLanguage:Chinese simplified (zh-utf-8)MySQL 字符集:UTF-8 Unicode (utf8)MySQL 连接校对 gbk_chinese_c…

Hadoop Serialization -- hadoop序列化具体解释 (2)【Text,BytesWritable,NullWritable】

回想:回想序列化,事实上原书的结构非常清晰,我截图给出书中的章节结构:序列化最基本的,最底层的是实现writable接口,wiritable规定读和写的游戏规则 (void write(DataOutput out) throws IOExce…

我需要多少个线程?

这取决于您的应用程序。 但是对于那些希望对如何从生产站点购买的所有昂贵内核中挤出更多资金的人来说,请多多包涵,我将阐明围绕多线程 Java应用程序的奥秘。 内容针对最典型的Java EE应用程序进行了“优化”,该应用程序具有Web前端&#xff…

H5网页适配 iPhoneX,就是这么简单

iPhoneX 取消了物理按键,改成底部小黑条,这一改动导致网页出现了比较尴尬的屏幕适配问题。对于网页而言,顶部(刘海部位)的适配问题浏览器已经做了处理,所以我们只需要关注底部与小黑条的适配问题即可&#…

python为什么closed_为什么python类的函数被调用两次[关闭](Why a function of python class is called twice [closed])...

为什么python类的函数被调用两次[关闭](Why a function of python class is called twice [closed])我遇到了两次调用的python类函数的问题。 我正在使用Spyder IDE。这是我的简单代码class Test:def f(self):print("a")from Test import *t Test()t.f()当我按“运行…

php关联数组和哈希表,php遍历哈希表及关联数组的实例代码

有关php数组的分类,PHP数组分为:数字索引数组和关联数组。其中数字索引数组和C语言中的数组一样,下标是为0,1,2…而关联数组下标可能是任意类型,与其它语言中的hash,map等结构相似。PHP遍历关联…

数字校园-云资源平台 2014.10.26-人人通共享空间

近期,教育部在统计学校信息化建设情况,当中一项重要内容,作为三通两平台的一个环节,就是学校开通人人通空间的情况,网上普及了一下知识,不就是十多年前就玩的学校博客的变种吗,网上有一些产品,也是没有热闹起来,为要求而要求的多,既然要求,就来一个吧,花了几天时间,也做了一个.…

VUE.js 中取得后台原生HTML字符串 原样显示问题

今天使用vue调试页面,发现了页面上的一个问题,后台数据传过来的HTML字符串并没有被转换为正常的HTML代码,一拍脑门,发现忘记转换了,于是满心欢喜加上了{{{}}}。但是之后构建发现报错: 为此去官网上查了下…

高性能持久消息

总览 尽管有许多可用于Java的高性能消息传递系统,但大多数都避免引用基准,包括持久消息传递和消息的序列化/反序列化。 这样做有很多原因。 1)您并不总是需要或想要持久消息2)您希望使用自己的序列化选项。 避免使用它们的一个重要…

python去掉重复内容并按原来次序输出元素_在Python中,从列表中删除重复项以使所有元素在保留顺序时都是唯一的最快的算法是什么?...

饮歌长啸使用方法:lst [8, 8, 9, 9, 7, 15, 15, 2, 20, 13, 2, 24, 6, 11, 7, 12, 4, 10, 18, 13, 23, 11, 3, 11, 12, 10, 4, 5, 4, 22, 6, 3, 19, 14, 21, 11, 1, 5, 14, 8, 0, 1, 16, 5, 10, 13, 17, 1, 16, 17, 12, 6, 10, 0, 3, 9, 9, 3, 7, 7, 6, 6, 7, 5, 1…

Lucene –快速添加索引和搜索功能

什么是Lucene? Apache LuceneTM是完全用Java编写的高性能,功能齐全的文本搜索引擎库。 它是一项适用于几乎所有需要全文搜索的应用程序的技术,尤其是跨平台的应用程序。 Lucene可以纯文本,整数,索引PDF,Of…

td 双击 编辑 php,双击表格td进行编辑

$(function(){//隔行换色// $("tbody tr:odd").css("background-color","#eee");var numId $(".tbody td");numId.dblclick(function(){var tdIns $(this);var tdpar $(this).parents("tr");//tdpar.remove();//current_…

前端开发之基础知识-HTML(一)

1.1 html概述和基本结构 html概述 HTML是 HyperText Mark-up Language 的首字母简写,意思是超文本标记语言,超文本指的是超链接,标记指的是标签,是一种用来制作网页的语言,这种语言由一个个的标签组成,用…

nodejs的async异步编程

函数有: series waterfall parallel parallelLimit … series函数 串行执行 它的作用就是按照顺序一次执行。 async.series({ one: function(callback){ callback(null, 1); }, two: function(callback){ callback(null, 2); } },function(err, results) { conso…

《深入理解Java虚拟机》读书笔记3--垃圾回收算法

转载:http://blog.csdn.net/tjiyu/article/details/53983064 下面先来了解Java虚拟机垃圾回收的几种常见算法:标记-清除算法、复制算法、标记-整理算法、分代收集算法、火车算法,介绍它们的算法思路,有什么优点和缺点,…

python常用函数中文_【python】python常用函数

urlencode与urldecode当url中包含中文或者参数包含中文,需要对中文或者特殊字符(/、&)做编码转换。urlencode的本质:把字符串转为gbk编码,再把\x替换成%。如果终端是utf8编码的,需要把结果再转成utf8输出,否则会乱…