MYSQL相關知識
阿新 • • 發佈:2021-06-30
一、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,用它來連線時會索引失效