Mysql效能調優五——建立高效能的索引
1.索引優化的必要性
索引優化是對查詢效能優化的最有效的手段,能夠輕鬆將查詢效能提升幾個數量級,建立一個真正的最優索引至關重要。且與查詢密不可分。
2.索引基礎
(29條訊息) 一文搞懂MySQL索引(清晰明瞭)_Free Joe的部落格-CSDN部落格_mysql索引
3. B-Tree索引
其對如下型別查詢有效:
a.全值匹配:對索引中的所有列進行匹配
b.最左字首匹配:匹配索引的第一列
c.匹配列字首:匹配某一列值的開頭部分
d.匹配範圍值
e.精確匹配某一列並範圍匹配另一列
f.只訪問索引的查詢
限制:
a.如果不是最左列開始查詢,則無法走索引
b.不能跳過索引列,如果三個列作為索引,無法單獨去匹配第一列和第三列
c.範圍查詢無法走索引,末尾模糊匹配無法走索引
4.雜湊索引
僅有精確匹配索引才有效,Mysql引擎中,memory引擎支援雜湊索引,不僅如此,其還支援非唯一雜湊索引。雜湊索引只包含雜湊值和指標,所以仍然需要讀取行。其為雜湊放置,無法進行排序。
5.索引的優點
a.大大減少了伺服器需要掃描的資料量
b.幫助伺服器避免排序和臨時表
c.將隨機I/O變成順序I/O。(隨機I/O:假設我們所需要的資料是隨機分散在磁碟的不同頁的不同扇區中的,那麼找到相應的資料需要等到磁臂(定址作用)旋轉到指定的頁,然後碟片尋找到對應的扇區,才能找到我們所需要的一塊資料,一次進行此過程直到找完所有資料,這個就是隨機IO,讀取資料速度較慢。順序I/O:
6.高效能索引策略
a.獨立的列:索引不應該是表示式的一部分,也不應該是函式的引數
b.字首索引和索引選擇性:對於BLOB/TEXT等型別,必須採用字首索引,因為Mysql並不支援索引這些列的完整長度。適當選擇字首的長度,當前綴的出現次數和實際列值的出現次數相仿時,證明字首選取比較合適。
c.多列索引:不應該為每個where條件單獨加上索引,而應該按照合適的順序建立多列索引。對於or條件,單列索引會走全表掃描,但若使用聯合union關鍵字,會讓查詢同時走兩個索引。但是實際上,採用多單列索引,會導致大量資源消耗。
d.選擇合適的索引列排序:當不要考慮排序和分組時,將選擇性高的列放在索引的最前列通常比較優秀。然後並不能只考慮索引列的選擇性,也和查詢的具體值、值的分佈有關。
e.聚簇索引:實際上聚簇索引並不是一種單獨的資料型別而是一種資料儲存方式。表有聚簇索引時,它的資料實際上存放在索引的葉子頁中。通常來說,資料行和相鄰的鍵緊挨著。
7.對於聚簇索引
InnoDB通過主鍵來聚集資料,也就是說聚簇索引的B+Tree上的葉子結點所儲存的key總是主鍵,如果沒有定義主鍵,InnoDB會選擇一個唯一的非空索引代替,如果沒有這樣的索引,InnoDB會隱式地定義一個主鍵來聚集(儲存)資料,這個隱式的主鍵被稱為rowID。這樣做的目的是為了避免隨機聚簇索引,保證順序寫入。對於非聚簇索引,InnoDB通常在葉子節點上儲存的是資料行的主鍵值,命中非聚簇索引時,InnoDB會拿到此主鍵值再去聚簇索引中查詢所需要的記錄,這個過程稱為回表。正是由於如此,所以通常來說聚簇索引的查詢效率要比非聚簇索引高。在InnoDB中,聚簇索引就是整個表。並且,儘量按照主鍵的順序插入資料,儘可能採用單調增加的聚簇鍵的值來插入新行。
什麼時候順序主鍵會造成壞的結果?當併發插入時,可能導致間隙鎖的競爭,降低效能。
8.覆蓋索引