1. 程式人生 > 其它 >MYSQL相關知識

MYSQL相關知識

一、mysql執行順序

FROM <left_table>
ON <join_condition>
<join_type> JOIN <right_table>
WHERE <where_condition>
GROUP BY <group_by_list>
HAVING <having_condition>
SELECT
DISTINCT <select_list>
ORDER BY <order_by_condition>
LIMIT <limit_number>

二、SQL JOINS(7種)

//並聯
SELECT <select_list> FROM TableA A INNER JOIN TableB B ON A.Key = B.Key;
//左外鏈、右外鏈
SELECT <select_list> FROM TableA A LEFT JOIN TableB B ON A.Key = B.Key;
SELECT <select_list> FROM TableA A RIGHT JOIN TableB B ON A.Key = B.Key;
//左外鏈獨有、右外鏈獨有
SELECT <select_list> FROM TableA A LEFT JOIN TableB B ON A.Key = B.Key WHERE B.Key IS NULL;
SELECT <select_list> FROM TableA A RIGHT JOIN TableB B ON A.Key = B.Key WHERE B.Key IS NULL;
//全聯接
SELECT <select_list> FROM TableA A FULL OUTER JOIN TableB B ON A.Key = B.Key;
//各自獨有
SELECT <select_list> FROM TableA A FULL OUTER JOIN TableB B ON A.Key = B.Key WHERE A.KEY IS NULL AND B.Key IS NULL;

三、索引是什麼?

索引是幫助MySql高效獲取資料的資料結構。本質:索引是資料結構
簡單理解為:排好序的快速查詢的資料結構
兩大功能:查詢和快速
索引比較大,一般以檔案形式儲存在磁碟上
優勢:
    提高檢索效率,降低資料庫IO成本
  降低資料排序的成本,降低CPU消耗
劣勢:
    索引列佔用空間
  提高查詢速度,同時降低更新表的速度
  大資料的表,需要花時間研究建立最優秀的索引,或優化查詢sql、索引
分類:
    單值索引:即一個索引包含單個列,一個表可以有多個單列索引
  唯一索引:索引列的值必須唯一,但允許有空值
  複合索引:即一個索引包含多個列
  ps:建議單表不超過5個索引

mysql索引結構:

    BTree:
    檢索原理:
  Hash索引
  full-text全文索引
  R-Tree索引
那些情況建索引:
    1、主鍵自動建立唯一索引
  2、頻繁查詢條件欄位
  3、查詢中與其它表關聯的欄位,外來鍵關係建立索引
  4、頻繁更新的欄位不適合建立索引
  5、where條件裡用不到的欄位不建立索引
  6、單\組合先選擇組合
  7、查詢中排序的欄位,排序欄位若通過索引去訪問大大提高排序速度
  8、查詢中統計或者分組欄位
那些情況不能建索引:
    1、表記錄太少
  2、經常增刪改
  3、重複且平均分配的表字段,因此應該只為最經常查詢和最經常排序的資料建立索引
    注意:如果某個資料列包含許多重複的內容,為他建立索引就沒有太大的實際效果。

四、效能分析

MySql常見瓶頸:
    CPU:
  IO:
  伺服器硬體瓶頸
Explan:
    是什麼(檢視執行計劃):使用EXPLAN關鍵字可以模擬化器執行SQL查詢語句,從而知道MySQL是如何處理你的SQL語句的。分析你的查詢語句或是表結構的效能瓶頸。
    
  能幹什麼:
    1、表的讀取順序
    2、資料讀取操作的操作型別
    3、哪些索引可以使用
    4、哪些索引實際被使用
    5、表之間的飲用
    6、每張表有多少行被優化器查詢
    
  各自段解釋:
    id:
        id相同,執行順序由上而下
      id不同,如果是自查詢,id序號會遞增,id值越大優先順序越高,越被先執行
      id相同不同,同時存在,id越大先執行,然後由上而下執行
    select_type:
        有哪些:SIMPLE、PRIMARY、SUBQUERY、DERIVED、UNION、UNION RESULT
      查詢的型別,主要用於區別 普通查詢、聯合查詢、子查詢等的複合查詢
    table:表
    type:訪問型別排序 
        最好到最次:system > const > eq_ref > ref > range > index > ALL 
      system:表只有一條記錄(等於系統表),這是const型別的特例,平時不會出現,這個可以忽略不計
      const:表示通過索引一次就能找到了,const用於比較primary key或者unique索引。因為只匹配一行資料,所以很快
      eq_ref:唯一性索引掃描,對於每個索引鍵,表中只有一條記錄與之匹配。常見於主鍵或者唯一索引掃描
      ref:
        非唯一索引掃描,返回匹配某個單獨值的所有行
        本質上也是一種索引訪問,它返回所有匹配某個單獨值的行,然而它可能會找到多個複合條件的行,所以它應該屬於查詢和掃描的混合體
      range:
        只檢索給定範圍的行,使用一個索引來選擇行。key列顯示使用了哪個索引
        一般就是在你的where語句中出現between、<、>、in等的查詢
        這種範圍查詢掃描索引比全表掃描要好,因為它只需要開始於索引的某一點,而結束於另一點,不用掃描全部索引
      index:Full Index Scan,index於ALL區別為index型別只遍歷索引樹。這通常比ALL快,因為索引檔案通常比資料檔案小。
      ALL:Full Table Scan 將遍歷全表找出匹配的行
      
      備註:一般來熟至少要保證range
    possible_keys:可能使用到的索引,一個或者多個
    key:實際使用的索引
    key_len:表用索引中使用位元組數,可通過該列計算查詢中使用的索引長度。在不損失精確性的情況下,長度越短越好
        ken_len顯示的值為索引欄位的最大可能長度,並非實際使用長度,即ken_len是根據表定義計算而得,不是通過表檢索出來的。
    ref:顯示索引那一列被使用了,如果可能的話,是一個常數。哪些列或常量被用於查詢索引上的值。
    rows:根據表統計資訊及索引選用情況,大致估算出找到所需的記錄所需要讀取的行數
    Extra:十分重要的額外資訊
        1、Using filesort:說明mysql會對資料使用一個外部的索引排序,而不是按照表內的索引順序進行讀取。
         Mysql中無法利用索引完成的排序操作為“檔案排序”(比較危險且坑)
      2、Using temporary:十死無生!!! 使了用臨時表中儲存中間結果,MySQL在對查詢結果排序時使用臨時表。常見於排序order by和分組查詢group by
      3、Using index:好事~~~ 
         表示相映的select操作中使用了覆蓋索引(Covering Index),避免訪問了表的資料行,效率不錯!
         如果同時出現using where,表明索引被引用來索引鍵值的查詢;
         如果沒有同時出現using where,表明索引來讀取資料而非執行查詢動作。
         覆蓋索引(Covering index)。。。。。

索引優化

索引失效:
    1、全值匹配我最愛
  2、最佳左字首法則
  3、不在索引列上做任何操作(計算、函式、or型別轉換)
  4、儲存引擎不能使用索引中範圍條件右邊的列
  5、儘量使用覆蓋索引(只訪問索引的查詢(索引列和查詢列一致)),減少select*
  6、mysql在使用不等於(!=或者<>)的時候無法使用索引會導致全表掃描
  7、is null,is not null也無法使用索引
  8、like以萬用字元開頭(%abc...)mysql索引失效會變成全表掃描的操作
  9、字串不加單引號索引失效
  10、少用or,用它來連線時會索引失效