MySQL索引與最佳化

來源:互聯網
上載者:User

標籤:mysq   資料   順序   複合   索引   返回   參數   部分   基礎   

1. 效能下降,sql執行時間長原因:查詢語句沒寫好,索引失效,關聯太多join,伺服器參數設定不合理(JoinBuffer大小,SortBuffer大小,最大串連數)
2. 使用join時應該小表驅動大表,小資料集驅動大資料集
3. 索引:索引是協助MySQL高效擷取資料的一種資料結構,即索引的本質是資料結構。除了資料本身之外,MySQL資料庫還維護著一個滿足特定尋找演算法的資料結構,這些資料結構以某種方式指向資料,這樣就可以在這些資料結構的而基礎上實現高效的資料尋找演算法,這種資料結構就是索引。

4. 一把來說索引本身也很大,因此往往以索引檔案的形式儲存在磁碟上。我們通常使用的索引一般都是B樹(多路搜尋樹,不一定二叉樹)結構組織的索引。
5. 索引的優缺點:
    優點:使用索引查詢可以提高資料檢索效率,降低資料庫IO成本;使用索引排序

              可以降低資料排序的成本,降低了CPU的消耗。

    缺點:索引實際上也是一張表,該表儲存了主鍵與索引欄位,並指向實體表的記

              錄,所以索引也會佔用空間,雖然索引大大提高了查詢速度,但是會降低

              表的更新速度,例如insert,update,delete操作時除了更新表資料,還

              需要更新索引。

6. 索引分為單值索引,唯一索引,複合索引
7. mysql常見瓶頸:
    CPU:CPU飽和一般發生在資料裝入記憶體或者從磁碟上讀取資料的時候
    IO:磁碟IO瓶頸一般發生在裝入資料遠大於記憶體容量的時候
    伺服器(linux)硬體效能的瓶頸:top,free,iostat和vmstat來查看系統的效能狀態

8. 通過explain查看sql執行計畫,分析是否可以最佳化。執行計畫包含的資訊有:

(1). id:select 查詢的序號,包含一組數字,表示查詢中執行select子句或動作表

  的順序:如果id相同,執行順序自上至下;如果id不同,如果是子查詢,id的

  序號會遞增,id值越大優先順序越高,越先被執行
(2). select_type:查詢的類型,主要用於區別普通查詢,聯集查詢,子查詢等複雜

  的查詢。有以下可能值:
  simple:簡單查詢,不包含子查詢和union
  primary:查詢中若包含任何複雜的子部分,最外層的查詢被標記為primary
  subquery:select或者where中有子查詢
  derived:from中有子查詢
  union:union之後的查詢
  union result:從union表擷取結果的select
(3). table 顯示這一行的資料來自哪張表
(4). type:顯示查詢使用了哪種訪問類型,從最好到最差依次為:

  system>const>eq_ref>ref>range>index>All
  system : 表只有一行記錄,const類型特例,基本不會出現
  const : 表示索引依次就找到了。const用於比較primary key或者unique索引。

       因為只匹配一行資料,所以能很快找到,例如將主鍵置於where條件

                   中,mysql就能將查詢轉換為一個常量
  eq_ref : 唯一性索引掃描,對於每個索引鍵,表中只有一條記錄與之匹配,

      常見於主鍵或唯一性索引掃描
  ref : 非唯一性索引掃描,返回匹配某個單獨值的所有行。
  range :檢索給定範圍。一般出現在where字句中有between,<,>,in等的查詢
  index : full index scan,遍曆全部索引。雖然和下面出現的All都會掃描全表,

        但是因為索引檔案通常都比資料小,而且index是從索引檔案中讀取的,

        而All是從硬碟中讀取的
  all : full table scan
(5).possible_keys:可能用在這張表中的索引,查詢的欄位上存在索引就會被列出來
(6).key:實際使用的索引。查詢中如果使用了覆蓋索引,則該索引和查詢的欄位重合
(7).key_len:索引使用的位元組數
(8).ref:顯示索引的哪一列被使用了,如果可能的話是一個常數。哪些列或常量被用於尋找索引列上的值
(9).rows:根據表統計資訊以及索引使用方式,大致算出找到所需的記錄所需要讀取的行數
(10).Extra:額外的重要訊息。有以下可能值:
  using filesort:無法利用索引完成的排序,出現這種情況很影響效能
  using temporary:使用了暫存資料表儲存中間結果,對查詢結果排序的時候使用了

          暫存資料表,常見於order by和group by,十分影響效能,必須最佳化
  using index:使用了覆蓋索引,避免訪問了資料行,效率不錯
  using where:使用了where過濾
9. 索引最佳化:
 (1).全職匹配:
 (2).最佳左首碼原則:如果查詢了多列,查詢應該從索引的最左前列開始並且不要不要跳過索引中的列
 (3).不在索引上做任何操作(計算,函數,類型轉換(自動或手動)),否則會導致索引失效而轉向全表掃描
 (4).儲存引擎不能使用索引中範圍條件右邊的列
 (5).盡量使用覆蓋索引(只訪問索引的查詢(索引列和查詢列一致)),減少或避免select *
 (6).mysql在使用不等於(!=或者<>),is null,is not null 的時候無法使用索引會導致全表掃描
 (7).like以萬用字元開頭(like "%abc")會導致索引失效,但是百分比符號結尾不會(like "abc%"),解決like "%"開頭的可以使用覆蓋索引解決
 (8).字串不加引號會導致索引失效
 (9).少用or,用它來串連會導致索引失效
 (10).使用group by需謹慎,因為分組之前必先排序,有可能會導致暫存資料表的產生
10. sql最佳化步驟:先找到查詢慢的sql(通過慢查詢日誌抓取超過一定時間的sql)->explain分析sql->最佳化索引與查詢語句->如果問題還沒解決,使用show profile查看sql執行的資源消耗情況,然後如果sql已經最優,判斷是否mysql伺服器問題,根據情況調整相關參數。

 

MySQL索引與最佳化

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.