1,mysql的搜索引擎常用的有兩種MyISAM和InnoDB,那么我問大家一個問題队魏,搜索引擎是作用于表還是作用于數據庫呢?如果你真的不知道我建議你打開自己的表看一下臼疫,看下表的結構就明白了择份。
那么這兩個搜索引擎具體有什么區(qū)別呢,我們找到自己的mysql的安裝目錄看下里面的結構烫堤,
我們從上圖可以看到搜索引擎為MyISAM的表包含.frm,.MYD,.MYI荣赶。而搜索引擎為InnoDB的表包含.frm和.ibd兩個文件,那么這幾個文件分別代表什么呢鸽斟?這個問題先放到這我們轉一個話題拔创,先了解一下mysql索引的常用的數據結構,看懂了這幾個數據結構富蓄,再結合搜索引擎我們就明白了剩燥。
索引是什么呢?
是幫助mysql高效獲取排好序的數據結構(最簡單明了)
索引的數據結構包含哪些立倍?
二叉樹灭红,紅黑樹,hash(看下mysql在創(chuàng)建索引的時候選擇索引類型的時候有這一個選項)口注,B-Tree,B+Tree,相信能有耐心想看完這遍文章的就是想徹底了解搜索引擎和索引之間的關系比伏,以及索引數據結構的,不要告訴我這幾個數據結構沒聽過疆导,什么是紅黑樹不知道的話建議去看下jdk1.8的hashmap的數據結構理解赁项。https://www.cs.usfca.edu/~galles/visualization/Algorithms.html這個網站是數據結構可視化用的,建議你收藏澈段。
為什么我們的索引不用二叉樹呢悠菜,因為二叉樹有可能退化成鏈表結構結構,那么查詢效率就將會收到極大的限制败富,紅黑樹是一個自平衡二叉樹悔醋,我們用到的B-Tree是對二叉樹進行了橫向的擴展,為什么這么說呢兽叮,我的B-Tree或者B+Tree存儲的都是一組索引或者一組索引加上數據data,一個節(jié)點大概可以存儲16k芬骄,一般的索引是int或者bigint那么就可以一個節(jié)點存儲16kb/14b=1170個數據,那么h=3高度的就可以存儲最多為1170*1170*16大概為2千萬數據量鹦聪,一個16k的數據在進行磁盤io的時候是很快的账阻,所以加了索引以后2千萬的數據也就用幾百秒。
B-tree的數據結構
字體寫的不太好看泽本,能看懂就行淘太,葉子節(jié)點的指針為空
mysql選擇B+Tree是B-Tree的變種,兩者比較有什么區(qū)別呢?我們講完本節(jié)希望你能自己得出結論蒲牧,
B+Tree的特點
1撇贺,非葉子節(jié)點不存儲data,只存儲索引(冗余)索引字段在節(jié)點間有重復,看下? B-Tree有沒有這個重復的現象冰抢,當然沒有
2松嘶,非葉子節(jié)點包含所有的索引字段,B-Tree則包含索引對應的data字段
3挎扰,葉子節(jié)點用指針鏈接翠订,提高區(qū)間的訪問性能,我們在做業(yè)務開發(fā)的時候進行區(qū)間查詢是常用的鼓鲁,B+Tree進行區(qū)間查詢的效率要比B-Tree高很多蕴轨,看下圖如果查詢18到39之間的數據的話,B-Tree需要回到根節(jié)點重新遍歷一遍骇吭,而B+Tree葉子節(jié)點之間有指針可以直接查詢橙弱。并且節(jié)點存儲的是索引比B-Tree可以更多的存儲
好了數據結構這塊相信你理解了如果不理解可以留言。
那么我們回到之前的問題有關搜索引擎分別為MyISAM和InnoDB的存儲數據索引的了解燥狰,我們先來看下MyISAM科吭,上面提到了三個文件如果你忘了建議回去看一下叫什么吁峻,最好看下自己的安裝目錄的內容。
上面為們可以看出MyISAM索引文件和數據文件是分離的所以我們稱為非聚集索引,data存儲的是索引所在元素的磁盤地址指針案疲,我們會根據這個磁盤地址指針回查表恕洲。從上圖的標志我們可以看到MYI和MYD分別指的是mysql的index 和mysql的data.那么也不難理解innodb的文件.idb是索引文件和data文件的組合也稱為聚集索引
我們需要了解一下Innodb必須有逐漸因為數據結構的要求靴迫,如果建表的時候沒有主鍵点弯,那么innodb會自動給你創(chuàng)建使用uuid,我們不建議innodb自己創(chuàng)建的希望用整形自增的,因為我們在查索引數據結構的時候會進行索引大小的比較榛了,如果為UUID在讶,則數據就比較大,比較起來比較慢霜大。
我們簡單補充一下聯合索引的底層存儲結構長什么樣子构哺?
那么我們的索引有hash數據結構,查找單個數特別塊但是不支持范圍的查找战坤,B+Tree在范圍查找做的特別好曙强,葉子節(jié)點帶雙向鏈接,B-Tree則在范圍查找的時候很大可能需要重復從根節(jié)點查速度會特別慢途茫。