1. 程式人生 > >【六】高效能MySql筆記——高效能索引型別基礎

【六】高效能MySql筆記——高效能索引型別基礎

    資料庫優化除了好的設計,還需要好的索引,而作者在工作中與團隊成員、同事、以及在面試新人的時候發現,很多朋友並沒有對索引有一個正確的認識。當問到如何優化資料庫時?得到的答案,也是大家所能想到的唯一答案就是建立索引。但當我問到如何正確建立索引時,卻都不能正確回答。我曾經在團隊專案中實際測試過一個不恰當的索引會導致效率慢一個數量級。所以我們有必要真正的去了解一下索引的原理。

    索引:儲存在記憶體中,儲存引擎用於快速找到記錄的一種資料結構。索引優化應該是對查詢效能優化最有效的手段了。索引能夠輕易將查詢效能提高几個數量級“最優”的索引有時比一個“好的”索引效能要好兩個數量級。在MySql中一個查詢會先在索引中找到對應的值,然後根據匹配的索引記錄找到對應的資料行。

    基礎

    索引可以包含一個或多個列的值。MySql只能高效地使用索引的最左字首列。建立一個包含兩個列的索引,和建立兩個只包含一個列的索引是大不相同的。無論是多麼複雜的ORM工具,在精妙和複雜的索引面前都是“浮雲”。

    索引的型別

    在MySql中,索引是在儲存引擎層實現的。所以不同的儲存引擎索引標準不通。索引根據CREATE TABLE語句定義索引時列的順序。

    B-Tree 索引

    實際上很多儲存引擎使用的是B+Tree索引,即每個葉子節點都包含指向下一個葉子節點的指標,從而方便葉子節點的範圍遍歷。B-Tree通常意味著所有的值都是按順序儲存的,並且每一個葉子頁到根的距離相同。B-Tree 索引不再需要全表掃描來獲取需要的資料,取而代之的是從索引的根節點開始進行搜尋。根節點的槽中存放了指向子節點的指標,儲存引擎根據這些指標向下層查詢。通過比較節點頁的值和要查詢的值可以找到合適的指標進入下層子節點,這些指標實際上定義了子節點頁中值的上限和下限。最終儲存引擎要麼是找到對應的值,要麼該記錄不存在。葉子節點比較特別,他們的指標指向的是被索引的資料,而不是其他的節點頁。這種查詢類似與演算法中的二分法。(下圖引自:https://blog.csdn.net/sdauzxl/article/details/52234482)。


    B-Tree索引適用於全鍵值,鍵值範圍或鍵字首查詢。索引的另一個作用是對資料進行ORDER BY操作。在優化效能的時候,可能需要使用相同的列但順序不同的索引來滿足不通的查詢需求。

    B-Tree索引的限制

        ①如果不是按照最左字首的順序無法使用索引;

        ②同樣也不能跳過索引中的列;

        ③在查詢中某個列是範圍查詢,那麼其右邊的所有索引都將不能使用。

    雜湊索引

    雜湊索引是基於雜湊表實現,只有精確匹配索引所有列的查詢才有效。Memory引擎支援此索引。因為雜湊值並不能保證絕對唯一性,所以Memory引擎支援非唯一雜湊索引。即如果有多條資料具有相同的雜湊值,那麼會同時返回。雜湊索引結構緊湊,所以具有非常快的查詢速度。Memory引擎也支援B-Tree索引。

    雜湊索引的限制

        ①雜湊索引不能避免讀取行;

        ②雜湊索引是無序的,所以無法進行排序;

        ③雜湊索引不支援部分索引列查詢;

        ④雜湊索引只支援等值比較查詢,不支援範圍查詢;

        ⑤訪問雜湊索引的資料非常快,除非有很多雜湊衝突。當出現雜湊衝突時,儲存引擎必須進行全表掃描;

        ⑥雜湊衝突很多的話,索引維護代價會很高。

    InnoDB儲存引擎本身不具備雜湊索引能力,但是其具有類似的“自適應雜湊索引”。當某些索引使用頻繁時,InnoDB會自動在B-Tree索引之上再建立一個雜湊索引。這個能力不需要我們維護。對於其他一些不支援雜湊索引的儲存引擎我們可以建立自定義雜湊索引。這種操作需要我們在表中增加一列儲存對應列的雜湊值,然後在WHERE子句中手動指定使用雜湊函式。

SELECT id FROM url WHERE url="http://www.codertoy.com" AND url_crc = CRC32("http://www.codertoy.com");

    在使用雜湊索引時,儘量不要使用SHA1()和MD5()作為雜湊值。因為其值長,且比較慢。對於大資料量的資料表,可以考慮自己實現一個64位的雜湊函式來避免出現大量的雜湊衝突。

    空間資料索引

    空間資料索引無需字首查詢。空間索引會從所有維度來索引資料。查詢時可以使用任意組合。MyISAM引擎支援這種索引,必須使用GIS相關函式MBRCONTAINS()等來維護資料。

    全文索引

    全文索引通過查詢文字中的關鍵詞,而不是直接比較索引中的值。這種索引類似於搜尋引擎,不是簡單的WHERE條件匹配。適用於MATCH AGAINST操作。

    分形樹索引

    分形樹索引具有B-Tree的很多優點,避免了B-Tree的很多缺點。

    索引的優點

        ①索引減少了掃描資料的量;

        ②幫助伺服器避免排序和臨時表(B-Tree索引是順序儲存可支援ORDER BY和GROUP BY);

        ③索引可以將隨機I/O變為順序I/O,從而提高查詢效率。