數(shù)據(jù)庫(kù)索引靈魂拷問(2)

繼上一篇分析的索引問題后锁摔,我們知道了索引的作用和結(jié)構(gòu)恢暖,這一篇文章將繼續(xù)圍繞索引的一些類型知識(shí)點(diǎn)進(jìn)行分析

索引分為聚簇索引和非聚簇索引浩峡,那么這兩者之間是有什么區(qū)別嗎

mysql索引圖.png

上篇的B+樹結(jié)構(gòu)我們知道锥债,葉子節(jié)點(diǎn)存放著一行的數(shù)據(jù)叉谜,這個(gè)是區(qū)分兩者的重要特征旗吁,如圖所示,左邊的圖是InnoDB的主鍵索引和二級(jí)索引停局,右邊為MyISAM的索引很钓,我們可知,對(duì)于MyISAM而言董栽,葉結(jié)點(diǎn)包含索引字段值及指向數(shù)據(jù)頁(yè)數(shù)據(jù)行的邏輯指針码倦,也就是說表的數(shù)據(jù)和索引是分隔開的,主鍵索引和二級(jí)索引并無差
別锭碳,查找數(shù)據(jù)的時(shí)候需要根據(jù)索引存放的數(shù)據(jù)行指針進(jìn)一步查找袁稽。對(duì)于InnoDB而言,索引有主鍵索引和普通索引的分別擒抛,聚簇索引根據(jù)主鍵來構(gòu)建推汽,葉子節(jié)點(diǎn)存在這一行的數(shù)據(jù),普通索引存放這主鍵的以及構(gòu)成索引的字段歧沪,也就是說在select查找的時(shí)候歹撒,如果是用的主鍵索引,則無需回表查詢诊胞,可以直接返回所查的數(shù)據(jù)暖夭,如果使用的是普通索引查詢,如果查詢的字段恰好為字段本身撵孤,也無需回表查詢迈着,如果查詢的字段不在構(gòu)成索引字段本身內(nèi),則需要根據(jù)主鍵回表查詢其他的字段邪码。由此可見裕菠,對(duì)于mysql來說 (select *)本身也是會(huì)影響查詢效率,最好是只查需要的字段霞扬,覆蓋索引糕韧,避免回表

下面分析一下常見的索引類型

  • 主鍵和唯一索引
    對(duì)于一個(gè)表來說枫振,唯一索引可以有多個(gè),但是只有一個(gè)主鍵萤彩。主鍵就是唯一索引粪滤,但是唯一索引不一定是主鍵,唯一索引可以為空雀扶,但是空值只能有一個(gè)杖小,主鍵不能為空,對(duì)于多列組成的唯一索引,需要保證具有唯一性

  • 聯(lián)合索引

聯(lián)合索引在日常數(shù)據(jù)庫(kù)使用的時(shí)候也是經(jīng)常被使用到的愚墓,我們以(a,b,c) 為例子構(gòu)建一個(gè)聯(lián)合索引予权,實(shí)際上構(gòu)建了(a),(a,b),(a,b,c)三個(gè)索引,聯(lián)合索引 有“最左前綴”原則浪册,遇到范圍查詢(>扫腺、<、between村象、like)就會(huì)停止匹配笆环。接下來就分析一下常見的幾個(gè)問題。

例如下表:建立(a,b,c)的索引

CREATE TABLE `test` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `a` varchar(15) NOT NULL,
  `b` varchar(15) NOT NULL,
  `c` varchar(15) NOT NULL,
  `d` varchar(15) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `index_a_b_c` (`a`,`b`,`c`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

  1. 如果顛倒a厚者、b躁劣、c順序是否會(huì)使用到索引

EXPLAIN SELECT * FROM test WHERE c='test' AND a='test' AND b='test'

第一.png

可見MySQL會(huì)自動(dòng)對(duì)查詢的列進(jìn)行調(diào)整,不影響索引的使用

  1. 如果放棄最左原則库菲,也就是不查a账忘,直接查詢b、c
    EXPLAIN SELECT * FROM test WHERE c='test' AND b='test'
    第二.png

說明不使用第一個(gè)查詢列的時(shí)候是無法觸發(fā)索引的

根據(jù)上面的結(jié)果我們現(xiàn)在反推一些查詢語句的時(shí)候應(yīng)該如何建立索引

  1. SELECT * FROM test WHERE a > 1 and b = 2

如果上面這個(gè)查詢語句建立的是(a熙宇,b)的時(shí)候是只能使用到a索引鳖擒,如果是建立(b,a)的索引奇颠,MySQL的優(yōu)化器會(huì)幫我們調(diào)整败去,從而使用到索引

  1. EXPLAIN SELECT * FROM test WHERE a IN (1,7,9) and b > 1

還是對(duì)(a,b)建立索引烈拒,因?yàn)镮N在這里可以視為等值引用圆裕,不會(huì)中止索引匹配,所以還是(a,b)

  1. SELECT * FROM test WHERE a > 1 and b = 2 and c > 3;

對(duì)于上面的語句而言,建立(b,c)還是(b,a)都差不多荆几,因?yàn)闊o法全部都涉及到吓妆,所以需要看具體使用情況

  1. 隨便分析一個(gè)索引和排序的問題吧
EXPLAIN SELECT * FROM test WHERE  a =1 ORDER BY b;
EXPLAIN SELECT * FROM test WHERE  a >1 ORDER BY b;

上面建立了(a,b)的索引,當(dāng)a = 1的時(shí)候吨铸,b相對(duì)有序行拢,可以避免再次排序,而第二個(gè)語句是一個(gè)范圍查詢诞吱,這個(gè)范圍內(nèi)b值是無序的舟奠,沒有必要對(duì)(a,b)建立索引

第三.png
第四.png

共同進(jìn)步竭缝,學(xué)習(xí)分享

歡迎大家關(guān)注我的公眾號(hào)【寫代碼的小楊】,相關(guān)文章沼瘫、學(xué)習(xí)資料都會(huì)在里面更新抬纸,整理的資料也會(huì)放在里面。

覺得寫的還不錯(cuò)的就點(diǎn)個(gè)贊耿戚,加個(gè)關(guān)注唄湿故!點(diǎn)關(guān)注,不迷路膜蛔,持續(xù)更新L持怼!皂股!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末墅茉,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子屑墨,更是在濱河造成了極大的恐慌躁锁,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卵史,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡搜立,警方通過查閱死者的電腦和手機(jī)以躯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來啄踊,“玉大人忧设,你說我怎么就攤上這事〉咄ǎ” “怎么了址晕?”我有些...
    開封第一講書人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)顿锰。 經(jīng)常有香客問我谨垃,道長(zhǎng),這世上最難降的妖魔是什么硼控? 我笑而不...
    開封第一講書人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任刘陶,我火速辦了婚禮,結(jié)果婚禮上牢撼,老公的妹妹穿的比我還像新娘匙隔。我一直安慰自己,他們只是感情好熏版,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開白布纷责。 她就那樣靜靜地躺著捍掺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪再膳。 梳的紋絲不亂的頭發(fā)上乡小,一...
    開封第一講書人閱讀 51,488評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音饵史,去河邊找鬼满钟。 笑死,一個(gè)胖子當(dāng)著我的面吹牛胳喷,可吹牛的內(nèi)容都是我干的湃番。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼吭露,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼吠撮!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起讲竿,我...
    開封第一講書人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤泥兰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后题禀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鞋诗,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年迈嘹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了削彬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡秀仲,死狀恐怖融痛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情神僵,我是刑警寧澤雁刷,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站保礼,受9級(jí)特大地震影響沛励,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜氓英,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一侯勉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧铝阐,春花似錦址貌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)遍蟋。三九已至,卻和暖如春螟凭,著一層夾襖步出監(jiān)牢的瞬間虚青,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工螺男, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留棒厘,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓下隧,卻偏偏與公主長(zhǎng)得像奢人,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子淆院,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

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