mysql 聯(lián)合索引原理詳述

在一個市民信息表上狂魔,是否有必要將身份證號

和名字建立聯(lián)合索引慈迈?

假設這個市民表的定義是這樣的:

CREATE TABLE `tuser` (

`id` int(11) NOT NULL,

`id_card` varchar(32) DEFAULT NULL,

`name` varchar(32) DEFAULT NULL,

`age` int(11) DEFAULT NULL,

`ismale` tinyint(1) DEFAULT NULL,

PRIMARY KEY (`id`),

KEY `id_card` (`id_card`),

KEY `name_age` (`name`,`age`)

) ENGINE=InnoDB

我們知道,身份證號是市民的唯一標識仰猖。也就是說皿伺,如果有根據(jù)身份證號查詢市民信息的需求,

我們只要在身份證號字段上建立索引就夠了撞鹉。而再建立一個(身份證號、姓名)的聯(lián)合索引颖侄,是

不是浪費空間鸟雏?

如果現(xiàn)在有一個高頻請求,要根據(jù)市民的身份證號查詢他的姓名览祖,這個聯(lián)合索引就有意義了孝鹊。它

可以在這個高頻請求上用到覆蓋索引,不再需要回表查整行記錄展蒂,減少語句的執(zhí)行時間又活。

當然,索引字段的維護總是有代價的锰悼。因此柳骄,在建立冗余索引來支持覆蓋索引時就需要權(quán)衡考慮

了。這正是業(yè)務 DBA箕般,或者稱為業(yè)務數(shù)據(jù)架構(gòu)師的工作耐薯。

最左前綴原則

看到這里你一定有一個疑問,如果為每一種查詢都設計一個索引,索引是不是太多了曲初。如果我現(xiàn)

在要按照市民的身份證號去查他的家庭地址呢体谒?雖然這個查詢需求在業(yè)務中出現(xiàn)的概率不高,但

總不能讓它走全表掃描吧臼婆?反過來說抒痒,單獨為一個不頻繁的請求創(chuàng)建一個(身份證號,地址)的

索引又感覺有點浪費颁褂。應該怎么做呢评汰?

這里,我先和你說結(jié)論吧痢虹。B+ 樹這種索引結(jié)構(gòu),可以利用索引的“最左前綴”主儡,來定位記錄奖唯。

為了直觀地說明這個概念,我們用(name糜值,age)這個聯(lián)合索引來分析丰捷。

? ? ? ? ? ? ? ? ? ? ?圖 2 (name,age)索引示意圖

可以看到寂汇,索引項是按照索引定義里面出現(xiàn)的字段順序排序的病往。

當你的邏輯需求是查到所有名字是“張三”的人時,可以快速定位到 ID4骄瓣,然后向后遍歷得到所有

需要的結(jié)果停巷。

如果你要查的是所有名字第一個字是“張”的人,你的 SQL 語句的條件是"where name like ‘張

%’"榕栏。這時畔勤,你也能夠用上這個索引,查找到第一個符合條件的記錄是 ID3扒磁,然后向后遍歷庆揪,直

到不滿足條件為止。

可以看到妨托,不只是索引的全部定義缸榛,只要滿足最左前綴,就可以利用索引來加速檢索兰伤。這個最左

前綴可以是聯(lián)合索引的最左 N 個字段内颗,也可以是字符串索引的最左 M 個字符。

基于上面對最左前綴索引的說明医清,我們來討論一個問題:在建立聯(lián)合索引的時候起暮,如何安排索引

內(nèi)的字段順序。

這里我們的評估標準是,索引的復用能力负懦。因為可以支持最左前綴筒捺,所以當已經(jīng)有了 (a,b) 這個

聯(lián)合索引后,一般就不需要單獨在 a 上建立索引了纸厉。因此系吭,第一原則是,如果通過調(diào)整順序颗品,可

以少維護一個索引肯尺,那么這個順序往往就是需要優(yōu)先考慮采用的。

所以現(xiàn)在你知道了躯枢,這段開頭的問題里则吟,我們要為高頻請求創(chuàng)建 (身份證號,姓名)這個聯(lián)合索

引锄蹂,并用這個索引支持“根據(jù)身份證號查詢地址”的需求氓仲。

那么,如果既有聯(lián)合查詢得糜,又有基于 a敬扛、b 各自的查詢呢?查詢條件里面只有 b 的語句朝抖,是無法

使用 (a,b) 這個聯(lián)合索引的啥箭,這時候你不得不維護另外一個索引,也就是說你需要同時維護

(a,b)治宣、(b) 這兩個索引急侥。

這時候,我們要考慮的原則就是空間了炼七。比如上面這個市民表的情況缆巧,name 字段是比 age 字段

大的 ,那我就建議你創(chuàng)建一個(name,age) 的聯(lián)合索引和一個 (age) 的單字段索引豌拙。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末陕悬,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子按傅,更是在濱河造成了極大的恐慌捉超,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件唯绍,死亡現(xiàn)場離奇詭異拼岳,居然都是意外死亡,警方通過查閱死者的電腦和手機况芒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門惜纸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事耐版§艄唬” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵粪牲,是天一觀的道長古瓤。 經(jīng)常有香客問我,道長腺阳,這世上最難降的妖魔是什么落君? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮亭引,結(jié)果婚禮上绎速,老公的妹妹穿的比我還像新娘。我一直安慰自己焙蚓,他們只是感情好朝氓,可當我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著主届,像睡著了一般。 火紅的嫁衣襯著肌膚如雪待德。 梳的紋絲不亂的頭發(fā)上君丁,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天,我揣著相機與錄音将宪,去河邊找鬼绘闷。 笑死,一個胖子當著我的面吹牛较坛,可吹牛的內(nèi)容都是我干的印蔗。 我是一名探鬼主播,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼丑勤,長吁一口氣:“原來是場噩夢啊……” “哼华嘹!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起法竞,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤耙厚,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后岔霸,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體薛躬,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年呆细,在試婚紗的時候發(fā)現(xiàn)自己被綠了型宝。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖趴酣,靈堂內(nèi)的尸體忽然破棺而出梨树,到底是詐尸還是另有隱情,我是刑警寧澤价卤,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布劝萤,位于F島的核電站,受9級特大地震影響慎璧,放射性物質(zhì)發(fā)生泄漏床嫌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一胸私、第九天 我趴在偏房一處隱蔽的房頂上張望厌处。 院中可真熱鬧,春花似錦岁疼、人聲如沸阔涉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瑰排。三九已至,卻和暖如春暖侨,著一層夾襖步出監(jiān)牢的瞬間椭住,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工字逗, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留京郑,地道東北人。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓葫掉,卻偏偏與公主長得像些举,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子俭厚,可洞房花燭夜當晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內(nèi)容