1. 程式人生 > >msql優化--索引優化

msql優化--索引優化

           關於資料庫優化指標主要為:響應時間,掃描行數,返回行數。對於響應時間,主要體現在伺服器級別,伺服器效能,網路響應速度等;索引主要為了減少掃描行數;根據limit來限制返回行數。

        常用的索引有:B-Tree索引,雜湊索引,空間索引,全文索引。除此之外,按照資料儲存方式可以分為聚集索引和非聚集索引。

【索引型別】

B-Tree索引                     B-tree索引按照二叉樹的方式進行儲存,葉子頁儲存著索引的值,枝節點按照一定範圍進行儲存索引值。mysql查詢通過訪問枝節點快速定位到葉子節點,通過葉子節點儲存的行地址查詢到磁碟中的資料,這樣減少掃描資料行。
      B-Tree索引的查詢方式:全鍵值查詢(遍歷所有的索引值),鍵值範圍(in語句查詢等),建字首查詢(match匹配方式查詢),精確某一列範圍匹配另外一列,值訪問索引查詢(直接定位到某一個值)。       在使用B-Tree索引作為查詢條件時有很多限制條件,注意這些限制條件對我們的查詢優化有很多幫助,下面通過例子的方式進行描述:                                                                                                                         
        1. 在多列索引中,必須按照最左列開始查詢,不然無法使用索引特性。例如上例:where條件不能使用last_name,first_name,dob的順序進行索引查詢
       2. 不能跳過索引列。例如:查詢條件first_name,dob的查詢將不能發揮索引特性。        3. 查詢條件中部使用範圍查詢,則右邊的條件則不能使用索引查詢。例如:first_name使用了in條件查詢,則last_name,dob則不是索引查詢。

雜湊索引

        雜湊索引只能精確匹配索引列值才能發揮作用,其儲存結構是將索引值通過雜湊演算法將鍵值進行儲存。且雜湊索引支援的資料引擎是memory,我們通用的InnoDB資料引擎是無法直接支援雜湊索引的,它可以通過自適應雜湊索引技術模擬雜湊索引的功能。                                                             
       雜湊索引的儲存方式按照鍵值順序儲存,屬於常數查詢,儲存內容與B-Tree索引相比不會儲存索引列的值。因此查詢時先訪問索引頁,然後通過行地址訪問資料行,減少掃描資料行。       雜湊索引的限制:       1. 索引頁只包含雜湊值和行指標,不包含資料值。       2. 資料行不是按照索引值的順序來儲存的,這樣在排序操作時,索引列順序和資料行順序不一致導致效能消耗。       3. 必須匹配索引列的值,不能使用模糊匹配(like,match語句)       4. 只支援等值比較(<,>,<>則不支援)

 聚簇索引

       聚簇索引是InnoDB支援,但MyISAM資料引擎不支援的一種資料儲存方式。它將資料行放入到索引頁中,儲存方式與B-Tree索引及其相似。        InnoDB通過主鍵來聚集資料,如果沒有主鍵則通過唯一非空索引代替。                     
       如上圖,聚簇索引的索引值和資料儲存在一起,這樣訪問速度更快。它任有一些限制:         1. 聚簇索引將資料行全部放入記憶體中,訪問順序不在重要了。         2.  插入順序嚴重依賴殺入的位置,資料行的移動導致速度降低,因此不適合經常進入插入資料的表應用。         3.  當一個索引頁無法存放所有的資料時,出現索引頁斷裂的問題         4. 二次索引需要掃描全表,速度下降。

    【高效索引策略】

         當我們瞭解了索引的儲存特點及限制,則在建立索引的時候就能夠有效的避免這些索引限制,下面我們通過如何選擇索引列,索引列的數值最好具備什麼樣的特性,以及應用索引列的技巧進行闡述:         1. 索引要作為單獨的列,不能使用表示式一部分或者函式的引數。         2. 索引列要儘可能簡短,從效能考慮使用UUID作為索引列是很糟糕的!它在掃描查詢,維護順序上要消耗更多的資源。         3. 選擇合適的字首索引,在每個索引值對應的資料均勻的前提下,根據索引選擇性進行判斷(去重索引列值個數/總行數)         4. 對於單個索引來說,將查詢出最少的資料條件放到前面。         5. 按照索引的順序進行排序操作(可以使用explain命令,type型別是index)         6. 關聯多張表時,on條件都使用索引列,order by子句都為第一個表時,才使用索引做排序。

【總結】

         索引在查詢提供了很大的便利,但是在更新和插入操作又帶來了負擔,我們最好在執行增刪改操作的時候禁用索引,然後再啟用。