一次搞清楚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.pswp.cn/news/370279.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370279.shtml
英文地址,請注明出處:http://en.pswp.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輸出,否則會亂…