索引是一種可以幫助我們快速檢索資料庫中的資料的資料結構
接下來,我們具體聊聊mysql中的索引
索引分類從儲存結構上來劃分:btree索引(b-tree或b+tree索引),hash索引,full-index全文索引,r-tree索引
從應用層次來分:普通索引,唯一索引,符合索引
根據資料中的物理順序與鍵值的邏輯(索引)順序關係:聚集索引,非聚集索引(除了聚集索引,其他的都是非聚集索引)普通索引:即乙個索引只包含單個列,乙個表中可以有多個單列索引
唯一索引:索引列必須唯一,但允許有空值
復合索引:即乙個索引包含多個列
詳解hash索引
實現基於雜湊表實現,只有精確匹配索引所有列的查詢才有效,對於每一行資料,儲存引擎都會對所有的索引列計算乙個雜湊碼(hash code),並且hash索引將所有的雜湊碼儲存在索引中,同時在索引表中儲存執行每個資料行的指標
優點由於hash索引結構的特殊性,其檢索效率非常高,索引的檢索可以一次定位。
缺點hash索引 僅僅能滿足「=」,「in」,「<=>」查詢,不能使用範圍查詢
由於hash索引比較的是進行hash運算之後的hash值,所以它只能用於等值的過濾,不能用於基於範圍的過濾,因為經過相應的hash演算法處理之後的hash值得大小關係,並不能保證和hash運算前完全一致hash索引無法被用來避免資料得排序操作
由於hash索引存放的是經過hash計算之後的hash值,而且hash值得大小關係並不一定和運算前的鍵值完全一致,所以資料庫無法利用索引的資料來避免任何排序運算hash索引不能利用部分索引鍵查詢
對於組合索引,hash索引在節算hash值得時候是組合索引合併後再一起計算hash值,而不是單獨計算hash值。所以通過組合索引的前面乙個或幾個索引鍵進行查詢的時候,hash索引無法被利用
b-tree索引
實現b-tree索引能加快資料的訪問速度,因為儲存引擎不再需要進行全表掃瞄來獲取資料,資料分布在各個節點
節點結構
每個節點都是乙個二元陣列:[key,data],所有節點都可以儲存資料,key為索引key,data為除key之外的資料
檢索原理
首先從根節點進行二分查詢,如果找到則返回對應節點的data,否則對相應區間的指標指向節點遞迴進行查詢,直到找到節點或未找到節點返回null指標。
b-tree意味著所有的值都是按順序儲存的,並且每乙個葉子到根的距離相同,很適合查詢範圍資料
缺點插入刪除新的資料記錄會破壞b-tree的性質,因此在插入刪除時,需要對樹進行乙個**、合併、轉移等操作以保持b-tree性質。造成io操作頻繁
區間查詢可能需要返回上層節點,導致查詢效率降低
b+tree索引
是b-tree的改進版,同時也是mysql資料庫所採用的儲存結構。非葉子節點不儲存data,只儲存key。只有葉子節點才儲存data
mysql中的b+tree
在經典的b+tree的基礎上進行了優化,增加了順序訪問指標。在b+tree的每個葉子節點增加了乙個指向相鄰葉子節點的指標,形成了帶有順序訪問指標的b+tree。這樣就提高了區間訪問效能。如果要查詢key為從18到49的所有資料記錄,只需要順著節點和指標順序遍歷就可以一次性訪問到所有的資料節點
為什麼mysql選擇b+tree索引?b+tree索引有什麼好處
索引本身也很多,不可能全部儲存在記憶體中,因此索引往往以索引檔案的形式儲存在磁碟上。這樣的話,索引查詢過程中就要產生io消耗,相對與記憶體訪問,io訪問的消耗高,所以索引的結構要儘量減少磁碟io訪問,提公升索引效率。
聚簇索引
聚簇索引是對磁碟上實際資料重新組織以按指定的乙個或多個列的值排序的演算法。特點是儲存資料的順序和索引順序一致。
即聚簇索引的葉子節點就是資料節點,而非聚簇索引的葉子節點仍然是索引節點,只不過有指向對應資料塊的指標。
innerdb中的聚簇索引
innerdb按聚簇索引的形式儲存資料,所以它的資料布局有很大的不同。它儲存資料的結構如下注:在innerdb中,索引b+tree的葉子節點中儲存了整行資料的是主鍵索引,也稱之為聚集索引。
而索引b+tree的葉子節點儲存了主鍵的值的是非主鍵索引,也稱之為非聚簇索引
mysql中的聚簇索引和b+tree索引的結構是一樣的,並且索引的資料檔案需要按照主鍵聚集,因此innerdb中要求表必須有主鍵,如果沒有指定mysql會自動選擇乙個可以唯一標識資料記錄的列作為主鍵,如果不存在這樣的列,mysql會為表生成乙個6位元組長整型作為主鍵
聯合索引
兩個或更多列上的索引叫聯合索引,聯合索引又叫復合索引。對於復合索引,mysql從左到右的使用索引中的字段,乙個查詢可以只使用索引中的一部分,但只能是最左側部分。例如索引是key index(a,b,c),可以支援a|a,b|a,b,c 3種組合進行查詢,但不支援b,c進行查詢。當最左側欄位是常量引用時,索引就十分有效
索引使用需要加索引的字段要在where條件種
資料量少的字段不需要加索引
如果where條件中是or關係,加索引不起作用
復合最左字首匹配原則
為什麼要使用聯合索引減少開銷
建乙個聯合索引(col1,col2,col3),實際上相當於建了(col1),(col1,col2),(col1,col2,col3)三個索引。每多乙個索引,都會增加寫操作的開銷和磁碟空間的開銷。對於大量資料的表,使用聯合索引會大大減少開銷覆蓋索引
對於聯合索引(col1,col2,col3),如果有如下sql
sql select col1,col2,col3 from test where col1 = 1 and col2=2
那麼mysql可以直接通過遍歷索引取得資料,而無需回表。
python為什麼用flask 為什麼用flask
flask是python在web開發領域乙個輕量級的框架,為什麼選擇flask呢?此文可能會給你答案。選擇flask的原因 1.微框架 簡潔 只做它需要做的,給開發展提供了很大的擴充套件性。2.flask和相關的依賴 jinja2 werkzeug 設計得非常優秀,用著簡單。3.開發效率非常高,比如...
為什麼用css sprites
在分析各個 的css時,我們經常可以看到一些 有很多的元素共享了一張背景,而這張背景包含了所有這些元素需要的背景,這種技術就叫做css sprites。例如 的css sprites url是 這樣做有什麼好處呢?顯而易見,瀏覽器在載入每一張的時候都會發起乙個http請求。如果使用css sprit...
為什麼用指標
相信接觸過程式設計的,大部分應該對c語言有一定了解或者學過一門c語言課程。或多或少聽到這種說法 c語言很難學,特別是指標。我大一下學期開的這門課,學完之後感覺還好 其實是我沒有深入學,典型的自我感覺良好 但指標那塊確實也沒太弄明白。現在好像明白了一點什麼是指標,在什麼情況下用比較好。int a 1 ...