《SQL優化入門》講座總結

  • MySQL運行機制緩存

    • MySQL每一個query只能運行在一個CPU上,更多的CPU,更快的CPU會更有利於併發
  • MySQL執行計劃併發

    • Using filesort: 表示沒法利用索引完成排序,也有多是由於多表鏈接時,排序字段不是驅動表中的字段MySQL中沒法利用索引完成的排序操做稱爲"文件排序"。
    • Using temporary:表示須要建立臨時表以知足需求,一般是由於GROUP BY的列沒有索引,或者GROUP BY和ORDER BY的列不同,也須要建立臨時表,建議添加適當的索引。
    • Using index: 表示相應的select 操做中使用了覆蓋索引(Covering index),避免訪問了表的數據行,效果不錯!若是同時出現Using where,代表索引被用來執行索引鍵值的查找。若是沒有同時出現Using where,表示索引用來讀取數據而非執行查找動做。
    • Covering Index:覆蓋索引也叫索引覆蓋,就是select 的數據列只用從索引中就可以取得,沒必要讀取數據行,MySQL能夠利用索引返回select 列表中的字段,而沒必要根據索引再次讀取數據文件。
    • Using index condition: 在5.6版本後加入的新特性,優化器會在索引存在的狀況下,經過符合RANGE範圍的條數 和 總數的比例來選擇是使用索引仍是進行全表遍歷。
    • Using where: 代表使用了where 過濾
    • Using join buffer: 代表使用了鏈接緩存
    • impossible where: where 語句的值老是false,不可用,不能用來獲取任何元素
    • distinct: 優化distinct操做,在找到第一匹配的元組後即中止找一樣值的動做。
    • 注意
      • 看下 type 這列的結果,若是有類型是 ALL 時,表示預計會進行全表掃描(full table scan)。一般全表掃描的代價是比較大的,建議建立適當的索引,經過索引檢索避免全表掃描
      • 再來看下 Extra 列的結果,若是有出現 Using temporary 或者 Usingfilesort 則要多加關注
  • MySQL如何使用索引函數

    • 索引匹配流程
    • 建索引的原則
    1.最左前綴匹配原則,很是重要的原則
    2.選擇區分度高的列做爲索引,即一個字段值的分佈要多,像狀態值這種只有幾個值的就不要建了
    3.索引列不能參與計算
    4.儘可能的擴展索引,不要新建索引
    • MySQL如何使用索引提升查詢效率
      • 使用索引的場景
      一、匹配全值
          對索引中全部列都指定具體值,即對索引中的全部列都有等值匹配的條件
      2.匹配值的範圍查詢
          對索引的值可以進行範圍查找
      3.匹配最左前綴
          僅僅使用索引中的最左邊列進行查詢
      4.僅對索引進行查詢
      • 不使用索引的場景
      1.以%開頭的like查詢
      2.數據類型出現隱式轉化,不會使用索引
      3.組合索引,不知足最左原則,不使用聚合索引
      4.用or分割條件,若or先後只要有一個列沒有索引,就都不會用索引
          使用 union all代替提升效率
      5.使用!= 或 <> 操做符時
      6.索引部分等值匹配,部分範圍匹配
  • SQL使用的規範
    1.禁止使用SELECT *,只獲取必要的字段,須要顯示說明列屬性優化

    2.禁止使用INSERT INTO t_xxx VALUES(xxx),必須顯示指定插入的列屬性code

    3.禁止使用屬性隱式轉換排序

    4.禁止在WHERE條件的屬性上使用函數或者表達式索引

    5.禁止負向查詢,以及%開頭的模糊查詢
    負向查詢條件:NOT、!=、<>、!<、!>、NOT IN、NOT LIKE等,會致使全表掃描it

    6.禁止大表使用JOIN查詢,禁止大表使用子查詢io

    7.禁止使用OR條件,必須改成IN查詢,或者 union、union alltable

    8.應用程序必須捕獲SQL異常,並有相應處理

相關文章
相關標籤/搜索