1. 程式人生 > >高效能MySQL之建立高效能的索引

高效能MySQL之建立高效能的索引

首先我們要認識到索引的各種型別;並在認識的基礎上進行對比;

B-Tree索引;

    儲存引擎的不同,會用到不同的技術;

  • MyISAM使用字首壓縮技術使得索引更小;
  • InnoDB則按照資料格式進行儲存;
  • MyISAM索引通過資料的物理位置引用被索引的行;
  • InnoDB根據主鍵引用被索引的行;

對於B-Tree索引的自我總結和概括:

簡單地說呢,就相當於我們的書本目錄一樣了,而InnoDB的索引就是根據主鍵來查詢的,因此,當我們建立索引之後,對於查詢的方式,就是現在索引中查詢你想要的主鍵,對應好之後,再跳到那一個主鍵對應的資料行,去查詢所有的資料; 

    伴隨著這種索引,我們就得出了以下幾種適用索引查詢的查詢方法; 

    假定現在的索引有三列,於是我們得出以下的匹配方式;

  1. 全值匹配:三列要求全部匹配,全值匹配;
  2. 匹配最左字首;只匹配最左層的值,只使用索引的第一列
  3. 匹配列字首;匹配第一列的一些部分字母;
  4. 匹配範圍值;範圍匹配;
  5. 精確匹配某一列並範圍匹配另外一列;從左到右,先精確匹配一列之後再範圍匹配查詢,但是記得,範圍查詢之後不能再做精確匹配了;
  6. 只訪問索引的查詢;專門就是隻訪問索引的;

    但隨之而來的還有B-Tree索引的限制:

  1. 如果不是從最左字首開始匹配的話,將無法使用索引;
  2. 不能跳過索引中間的列,例如,你不能只匹配第一列和第三列;而跳過了第二列,這是不允許的;
  3. 如果查詢中有某個列的範圍查詢,在這之後的所有列都無法使用索引優化查詢,這點在前面有說到了;

    雜湊索引;

        基於雜湊表實現,只有精確匹配索引所有列的查詢才有效;對於每一行資料,計算出一個雜湊碼,不同鍵值的行計算出來的雜湊碼也不一樣,將得出來的雜湊碼存入索引中,同時在索引中儲存指向每行資料的指標;         因為雜湊索引只儲存對應的雜湊值,所以索引的結構十分緊湊;也讓雜湊的查詢的速度非常快;

        雜湊索引的限制:

    1. 雜湊索引裡面只包含雜湊值和指標,而不儲存欄位值,所以無法通過索引來避免讀取行,意思也就是說,由於索引中不包含行的資料,所以沒有辦法通過只讀取索引來進而讀取整個行資料,不過,訪問記憶體中的行的速度很快,所以也問題不大;
    2. 雜湊索引不是按照索引值順序儲存的,所以也就無法用於排序了;
    3. 雜湊索引也不支援部分索引列匹配查詢,因為你雜湊索引畢竟是用索引列的全部內容來計算雜湊值的,沒辦法只用部分索引查詢;
    4. 雜湊索引只支援等值查詢,不支援範圍查詢;
    5. 訪問雜湊索引的速度非常快,除非有很多雜湊衝突;
    6. 如果雜湊衝突很多的話,一些索引維護操作的代價也會很高,因為你如果索引衝突了,就需要遍歷對應雜湊值的連結串列中的每一行,直到找到為止;

         當我們出現雜湊衝突的時候,我們要注意,我們不僅要給出雜湊值,還要給出對應的索引內容,這樣方便我們解決雜湊衝突,畢竟雜湊值相同時,只能通過這樣的方式去區別了;

    空間資料索引;

        emmmm。。。只剩下MyISAM表支援空間索引了,無需字首查詢,而是從所有維度來索引資料;

    全文索引;

        一種特殊型別的索引,查詢的文字中的關鍵詞;而不是直接比較索引中的值;     索引優點:         拿B-Tree索引來比較,因為資料有序,可以將相關列值都儲存在一起,而且因為索引中儲存了實際的列值,所以某些查詢只需要通過索引就能完成了;

        三大優點;

  • 索引大大減少了伺服器需要掃描的資料量;
  • 索引可以幫助伺服器避免排序和臨時表;
  • 索引可以將隨機I/O變為順序I/O;

    高效能的索引策略:

  1. 獨立的列:要求建立索引的列必須是獨立的列;
  2. 字首索引和索引選擇性;一般我們都是追求,高選擇性的索引的。什麼是高選擇的索引呢?是指不重複的索引和資料表的記錄總數的比值,在1/n和1之間,值越大,則選擇性越高,唯一索引的選擇性是1,這是最好的索引選擇性,效能也是最好的;對於BLOB,TEXT或者很長的VARCHAR型別的列,我們要求必須使用字首索引,因為不允許索引這些列的完整長度;
  3. 多列索引:通過在不同的列上建立不同的列索引,來進行匹配查詢;但是事實卻證明,使用多列索引只能說明的你的索引建的很糟糕;
  4. 選擇合適的索引列順序;正確的順序依賴於使用該索引的查詢,同時考慮如何更好地滿足排序和分組的需要;將選擇性最高的列放在最前面,只能說是一個比較通用方法,但不是最佳的辦法,具體看具體情況的分析;

    聚簇索引:

        聚簇索引:將索引和對應的資料行都儲存在聚簇索引中,也就是說,並不是一種單獨的索引型別,而是一種資料儲存方式,聚簇索引實際上是儲存了B-Tree索引和資料行;     在這裡我們要強調一下的就是B-Tree和聚簇索引的區別:         首先,這兩者是沒法比的,聚簇索引是B-Tree索引的一部分,B-Tree本身是一種索引型別了,就是按照B-Tree資料結構來實現的,而對於B-Tree索引來說,是用哪一個索引並不重要了,可能是主鍵,也可能是全部的資料,但是一定是儲存了指向對應資料行的指標的,這是一點,而聚簇索引就是儲存了B-Tree索引和對應的資料行,方便了資料的查詢;     聚簇索引的優點:
    1. 可以將相關資料儲存在一起;
    2. 資料訪問更快;
    3. 使用覆蓋索引掃描的查詢可以直接使用主鍵值;

    聚簇索引的缺點:

  1. 最大限度地提高了I/O密集型應用的效能;但是訪問順序沒有那麼重要了,沒有什麼優勢;
  2. 插入速度嚴重依賴於插入順序;
  3. 更新聚簇索引列 的代價很高;
  4. 會面臨頁分裂的的問題;
  5. 聚簇索引會導致全表掃描變慢;
  6. 二級索引(非聚簇索引)可能比想象的要更大;

    覆蓋索引:

        是指索引的葉子節點中已經包含要查詢的資料,如果一個所以包含所有需要查詢的欄位的值,就稱為覆蓋索引;直接掃描索引就可以查詢到你想要的值;         因為我們知道這個因為覆蓋索引要求,你在索引中就將要查詢的東西查到了,所以索引必須要儲存索引列的值,因此,雜湊索引,空間索引,全文索引都不能用於覆蓋索引;