Mysql 索引概念陪每,分類(lèi),使用技巧镰吵,優(yōu)化分析總結(jié)介紹

概念

  • mysql index官方文檔
  • 索引是數(shù)據(jù)庫(kù)管理系統(tǒng)中一種數(shù)據(jù)結(jié)構(gòu)檩禾,用以協(xié)助快速查詢(xún)數(shù)據(jù)庫(kù)表中數(shù)據(jù),典型的索引結(jié)構(gòu)如B+ tree疤祭。

有什么用盼产?

MySQL索引的建立對(duì)于MySQL的高效運(yùn)行是很重要的,索引可以大大提高M(jìn)ySQL的檢索速度勺馆。

打個(gè)比方戏售,如果合理的設(shè)計(jì)且使用索引的MySQL是一輛蘭博基尼的話(huà),那么沒(méi)有設(shè)計(jì)和使用索引的MySQL就是一個(gè)人力三輪車(chē)谓传。

拿漢語(yǔ)字典的目錄頁(yè)(索引)打比方蜈项,我們可以按拼音、筆畫(huà)续挟、偏旁部首等排序的目錄(索引)快速查找到需要的字。

分類(lèi)

物理存儲(chǔ)順序

  • MySQL的Innodb存儲(chǔ)引擎的索引分為聚集索引和非聚集索引(二級(jí)索引)侥衬。 聚集索引是Innodb引擎才有的概念诗祸。
  • 為什么說(shuō)是按照物理存儲(chǔ)順序分類(lèi)呢?因?yàn)榫奂饕倪壿嬳樞蚓褪菙?shù)據(jù)記錄的物理順序轴总,而非聚集索引卻不是如此直颅。 舉個(gè)例子,聚集索引就像是漢語(yǔ)字典中的拼音索引怀樟,字典中的字就是按照這個(gè)順序存的功偿。非聚集索引就像是部首索引,相同偏旁的字在索引頁(yè)上是相鄰的往堡,但是真實(shí)的位置卻不一定是相鄰的械荷。類(lèi)似的例子還有電話(huà)簿,大家自行想象一下虑灰。
  • 聚集索引怎么選定呢吨瞎?
    • 第一個(gè)唯一且不能為NULL的列就會(huì)被選為聚集索引,一般就是主鍵了穆咐。
    • 如果沒(méi)有符合條件的列颤诀,引擎會(huì)自動(dòng)生成一個(gè)6字節(jié)的ROWID字旭。
  • 非聚集索引為什么被稱(chēng)為二級(jí)索引呢? 因?yàn)槠渌饕罱K是指向聚集索引的key崖叫,一般來(lái)說(shuō)記錄還要通過(guò)聚集索引才能找到真實(shí)的記錄遗淳,這樣要經(jīng)過(guò)兩次索引查詢(xún),所以被稱(chēng)為二級(jí)索引心傀。
  • 非聚集索引可以有多個(gè)么屈暗?Innodb存儲(chǔ)引擎中行記錄就是按照聚集索引維度順序存儲(chǔ)的,Innodb的表也稱(chēng)為索引表剧包;因?yàn)樾杏涗浿荒馨凑找粋€(gè)維度進(jìn)行排序恐锦,所以一張表只能有一個(gè)聚集索引。

邏輯存儲(chǔ)

  • 唯一索引:column不可重復(fù)的索引
  • 主鍵索引:非NULL的唯一索引
  • 普通索引:相比前兩者要求要更低疆液,可以重復(fù)一铅,可以為空,一般要求區(qū)分度比較大堕油,不然可能也不會(huì)走這個(gè)索引
  • 聯(lián)合索引:多列組合的索引
  • 覆蓋索引:官方定義是說(shuō)包含了一個(gè)查詢(xún)的所有列的索引潘飘。列索引(column index),或者是聯(lián)合索引(composite index)就可以成為覆蓋索引掉缺。

數(shù)據(jù)類(lèi)型

  • b+ tree索引: btree也就是平衡多路查找樹(shù)的升級(jí)版本
  • hash索引:適合做精確的搜索卜录,不適合做范圍查詢(xún)
  • fulltext索引:希望通過(guò)關(guān)鍵字的匹配來(lái)進(jìn)行查詢(xún)過(guò)濾,那么就需要基于相似度的查詢(xún)
    • 引擎支持
      • MySQL 5.6 以前的版本眶明,只有 MyISAM 存儲(chǔ)引擎支持全文索引艰毒;
      • MySQL 5.6 及以后的版本,MyISAM 和 InnoDB 存儲(chǔ)引擎均支持全文索引;
      • 只有字段的數(shù)據(jù)類(lèi)型為 char搜囱、varchar丑瞧、text 及其系列才可以建全文索引。
  • R-tree索引: 一種多維度的空間索引蜀肘,例如:地圖左邊绊汹,巨型,多邊形

b+ tree

  • b+ tree官方文檔(注意官方文檔上一直寫(xiě)的是b-tree,但實(shí)際上大家為了區(qū)分普通的b-tree扮宠,都會(huì)叫b+ tree)
  • b tree: 在計(jì)算機(jī)科學(xué)中西乖,B樹(shù)(B-tree)是一種樹(shù)狀數(shù)據(jù)結(jié)構(gòu),它能夠存儲(chǔ)數(shù)據(jù)坛增、對(duì)其進(jìn)行排序并允許以O(shè)(log n)的時(shí)間復(fù)雜度運(yùn)行進(jìn)行查找获雕、順序讀取、插入和刪除的數(shù)據(jù)結(jié)構(gòu)轿偎。B樹(shù)典鸡,概括來(lái)說(shuō)是一個(gè)節(jié)點(diǎn)可以擁有多于2個(gè)子節(jié)點(diǎn)的二叉查找樹(shù)。與自平衡二叉查找樹(shù)不同坏晦,B-樹(shù)為系統(tǒng)最優(yōu)化大塊數(shù)據(jù)的讀和寫(xiě)操作萝玷。
  • b+ tree
    • 一種廣泛用于各種數(shù)據(jù)庫(kù)索引的數(shù)據(jù)結(jié)構(gòu), 能始終保持索引是排序的狀態(tài)嫁乘,支持等于和范圍查詢(xún)(包含大于,小于球碉,between and)
    • 它并不是一顆二叉樹(shù)蜓斧,因?yàn)樗淖庸?jié)點(diǎn)個(gè)數(shù)不限于兩個(gè)
  • b+ tree與 b tree的區(qū)別是什么?參考文章淺談算法和數(shù)據(jù)結(jié)構(gòu): 十 平衡查找樹(shù)之B樹(shù)
    • b+ tree的非葉子節(jié)點(diǎn)不包含數(shù)據(jù)信息睁冬,只包含導(dǎo)航信息
    • 樹(shù)的所有葉結(jié)點(diǎn)構(gòu)成一個(gè)有序鏈表挎春,可以按照關(guān)鍵碼排序的次序遍歷全部記錄。
    • b+ tree有n棵子樹(shù)的結(jié)點(diǎn)中含有n個(gè)關(guān)鍵字豆拨; (而b tree是n棵子樹(shù)有n-1個(gè)關(guān)鍵字)
  • B+ tree的優(yōu)點(diǎn)在于:
    • 由于B+樹(shù)在內(nèi)部節(jié)點(diǎn)上不好含數(shù)據(jù)信息直奋,因此在內(nèi)存頁(yè)中能夠存放更多的key。 數(shù)據(jù)存放的更加緊密施禾,具有更好的空間局部性脚线。因此訪(fǎng)問(wèn)葉子幾點(diǎn)上關(guān)聯(lián)的數(shù)據(jù)也具有更好的緩存命中率。
    • B+樹(shù)的葉子結(jié)點(diǎn)都是相鏈的弥搞,因此對(duì)整棵樹(shù)的便利只需要一次線(xiàn)性遍歷葉子結(jié)點(diǎn)即可邮绿。而且由于數(shù)據(jù)順序排列并且相連,所以便于區(qū)間查找和搜索攀例。而B(niǎo)樹(shù)則需要進(jìn)行每一層的遞歸遍歷船逮。相鄰的元素可能在內(nèi)存中不相鄰,所以緩存命中性沒(méi)有B+樹(shù)好粤铭。

索引列

  • 單列索引
  • 多列索引-組合索引/聯(lián)合索引/復(fù)合索引

存儲(chǔ)引擎支持

Innodb

  • B+ tree索引
  • (5.6及以后的版本)全文索引
  • (5.7及以后的版本)地理空間索引(Geospatial indexing)
  • 自適應(yīng)哈希索引:注意這個(gè)只是個(gè)優(yōu)化項(xiàng)目挖胃,不能自己在DDL中選定。在Mysql5.6及以上可用梆惯,這個(gè)索引是Innodb針對(duì)于Using 和 in 這兩種操作的一種優(yōu)化手段冠骄,只存在于內(nèi)存中,是基于已有B+ tree索引建立的加袋。hash的key是任意長(zhǎng)度的b+ tree索引的前綴,這個(gè)長(zhǎng)度是根據(jù)索引被搜索的模式來(lái)決定的抱既。

Myisam

  • B+ tree索引
  • 全文索引
  • 地理空間索引(Geospatial indexing)

使用技巧

建索引

  • 對(duì)常用排序职烧、分組,CURD條件字段應(yīng)當(dāng)建立索引
  • 索引的數(shù)量不宜過(guò)多防泵,避免冗余索引蚀之,DBA的建議是不超過(guò)5個(gè)。聯(lián)合索引的鍵不超過(guò)3個(gè)捷泞,太都了之后更新效率必然受到影響足删,而且似乎也沒(méi)有必要,極有可能造成索引的冗余
  • 主鍵盡量是數(shù)字锁右,避免使用字符串失受,因?yàn)槭褂脭?shù)字的判斷速度快
  • 索引的區(qū)分度盡量的大
  • 索引(邏輯)類(lèi)型選擇讶泰,按照邏輯順序
    • 每張表必須有一個(gè)主鍵索引,因?yàn)橹麈I索引速度快
    • 對(duì)于常用的字段拂到,如果唯一可以建立唯一索引痪署,如果不唯一可考慮建立普通索引
    • 組合使用列,可以使用聯(lián)合索引

用索引

  • 能用主鍵索引的地方一定要用上兄旬,速度快
  • 避免在索引字段上使用函數(shù)
  • 聯(lián)合索引的最左前綴原則

優(yōu)化分析

  • 5.7版本explain關(guān)鍵字狼犯,限于篇幅,這里只是簡(jiǎn)單說(shuō)一下
    • 作用:獲取SQL的執(zhí)行計(jì)劃信息
    • 信息來(lái)源:SQL語(yǔ)句優(yōu)化器-optimizer领铐。這些信息包含:優(yōu)化器是怎么處理語(yǔ)句的, 包括表連接的順序悯森。具體的信息見(jiàn)explain輸出格式
    • 作用范圍: SELECT, DELETE, INSERT, REPLACE以及UPDATE
  • 5.7版本慢查詢(xún)?nèi)罩?/a>

常見(jiàn)面試題

  • 索引類(lèi)型 @見(jiàn)筆記
  • 聚集索引和非聚集索引的差別? @見(jiàn)筆記
  • 自適應(yīng)哈希索引是什么绪撵? @見(jiàn)筆記
  • 覆蓋索引也有什么用瓢姻? @見(jiàn)筆記
  • 索引的優(yōu)化方式有哪些?或者說(shuō)有沒(méi)有一些索引優(yōu)化經(jīng)驗(yàn)莲兢?
    • 使用explain做分析
    • 建索引的一些原則, 見(jiàn)筆記
  • 聚集索引的選定標(biāo)準(zhǔn)是什么汹来? @見(jiàn)筆記
  • 聚集索引跟主鍵索引的差別是什么? @見(jiàn)筆記
  • 考察不同情況下是否會(huì)使用到聯(lián)合索引 @遵循最左前綴原則
  • b+ tree和b tree有什么區(qū)別?見(jiàn)筆記
  • b+ tree支持范圍查詢(xún)么改艇?支持收班,相鄰葉子節(jié)點(diǎn)會(huì)連接起來(lái)
  • 相比于hash索引,b+ tree索引有什么好處谒兄? 支持范圍查詢(xún)
  • 索引頁(yè)和數(shù)據(jù)頁(yè)的關(guān)系是什么摔桦?
    • 聚集索引的葉子節(jié)點(diǎn)是數(shù)據(jù)
    • 非聚集索引的索引葉子節(jié)點(diǎn),對(duì)應(yīng)的是聚集索引的鍵值承疲,需要到聚集索引也就是數(shù)據(jù)頁(yè)去查找數(shù)據(jù)
  • 一張表全是索引會(huì)怎么樣邻耕?
    • 索引頁(yè)數(shù)據(jù)量太大
    • 有重復(fù)索引,沒(méi)必要燕鸽,舉個(gè)例子:使用A條件就可以找到某一條記錄兄世,那么剩余的索引條件B,C,D,E其實(shí)都是沒(méi)有必要的

參考文章

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市啊研,隨后出現(xiàn)的幾起案子御滩,更是在濱河造成了極大的恐慌,老刑警劉巖党远,帶你破解...
    沈念sama閱讀 211,348評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件削解,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡沟娱,警方通過(guò)查閱死者的電腦和手機(jī)氛驮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)济似,“玉大人矫废,你說(shuō)我怎么就攤上這事盏缤。” “怎么了磷脯?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,936評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵蛾找,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我赵誓,道長(zhǎng)打毛,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,427評(píng)論 1 283
  • 正文 為了忘掉前任俩功,我火速辦了婚禮幻枉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘诡蜓。我一直安慰自己熬甫,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,467評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布蔓罚。 她就那樣靜靜地躺著椿肩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪豺谈。 梳的紋絲不亂的頭發(fā)上郑象,一...
    開(kāi)封第一講書(shū)人閱讀 49,785評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音茬末,去河邊找鬼厂榛。 笑死,一個(gè)胖子當(dāng)著我的面吹牛丽惭,可吹牛的內(nèi)容都是我干的击奶。 我是一名探鬼主播,決...
    沈念sama閱讀 38,931評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼责掏,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼柜砾!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起换衬,我...
    開(kāi)封第一講書(shū)人閱讀 37,696評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤局义,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后冗疮,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,141評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡檩帐,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,483評(píng)論 2 327
  • 正文 我和宋清朗相戀三年术幔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片湃密。...
    茶點(diǎn)故事閱讀 38,625評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡诅挑,死狀恐怖四敞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拔妥,我是刑警寧澤忿危,帶...
    沈念sama閱讀 34,291評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站没龙,受9級(jí)特大地震影響铺厨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜硬纤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,892評(píng)論 3 312
  • 文/蒙蒙 一解滓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧筝家,春花似錦洼裤、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至莹菱,卻和暖如春移国,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背芒珠。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工桥狡, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人皱卓。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓裹芝,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親娜汁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子嫂易,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,492評(píng)論 2 348

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