全域性修改滾動條樣式
阿新 • • 發佈:2021-01-20
技術標籤:C__資料庫
MySQL索引優化
MySQL索引的建立對於MySQL的高效執行是很重要的,索引可以大大提高MySQL的檢索速度。
所謂索引就是為特定的mysql欄位進行一些特定的演算法排序,比如二叉樹的演算法和雜湊演算法,雜湊演算法是通過建立特徵值,然後根據特徵值來快速查詢。而用的最多,並且是mysql預設的就是二叉樹演算法 BTREE,通過BTREE演算法建立索引的欄位,比如掃描20行就能得到未使用BTREE前掃描了2^20行的結果。
1. Explain優化查詢檢測
EXPLAIN可以幫助開發人員分析SQL問題,explain顯示了mysql如何使用索引來處理select語句以及連線表,可以幫助選擇更好的索引和寫出更優化的查詢語句。
使用方法,在select語句前加上Explain就可以了:
Explain select * from user where id = '1';
mysql在執行一條查詢之前,會對發出的每條SQL進行分析,決定是否使用索引或全表掃描如果傳送一條select * from blog where false,Mysql是不會執行查詢操作的,因為經過SQL分析器的分析後MySQL已經清楚不會有任何語句符合操作。
以上語句的查詢
欄位 | 含義 |
---|---|
id | 1 |
select_type | SIMPLE – 查詢型別(簡單查詢、聯合查詢、子查詢) |
table | sys_user-- 顯示這一行的資料是關於哪張表的 。 |
type | ALL – 全表掃描。從最好到最差的連線型別為system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL,const代表一次就命中,ALL代表掃描了全表才確定結果。一般來說,得保證查詢至少達到range級別,最好能達到ref |
possible_keys | birthday – 指出MySQL能使用哪個索引在該表中找到行。如果是空的,沒有相關的索引。這時要提高效能,可通過檢驗WHERE子句,看是否引用某些欄位,或者檢查欄位不是適合索引。 |
key | birthday – 實際使用到的索引。如果為NULL,則沒有使用索引。如果為primary的話,表示使用了主鍵。 |
key_len | 4 – 最長的索引寬度。如果鍵是NULL,長度就是NULL。在不損失精確性的情況下,長度越短越好。 |
ref | const – 顯示哪個欄位或常數與key一起被使用。 |
rows | 1 – 這個數表示mysql要遍歷多少資料才能找到,在innodb上是不準確的。 |
Extra | Using where; Using index – 執行狀態說明,這裡可以看到的壞的例子是Using temporary和Using |
select_type
- simple:簡單select(不使用union或子查詢)。
- primary:最外面的select。
- union:union中的第二個或後面的select語句。
- dependent union:union中的第二個或後面的select語句,取決於外面的查詢。
- union result:union的結果。
- subquery:子查詢中的第一個select。
- dependent subquery:子查詢中的第一個select,取決於外面的查詢。
- derived:匯出表的select(from子句的子查詢)。
型別
- system 表只有一行:system表。這是const連線型別的特殊情況。
- const:表中的一個記錄的最大值能夠匹配這個查詢(索引可以是主鍵或惟一索引)。因為只有一行,這個值實際就是常數,因為MYSQL先讀這個值然後把它當做常數來對待。
- eq_ref:在連線中,MYSQL在查詢時,從前面的表中,對每一個記錄的聯合都從表中讀取一個記錄,它在查詢使用了索引為主鍵或惟一鍵的全部時使用。
- ref:這個連線型別只有在查詢使用了不是惟一或主鍵的鍵或者是這些型別的部分(比如,利用最左邊字首)時發生。對於之前的表的每一個行聯合,全部記錄都將從表中讀出。這個型別嚴重依賴於索引匹配的記錄多少,越少越好。
- range:這個連線型別使用索引返回一個範圍中的行,比如使用>或<查詢東西時發生的情況。
- index: 這個連線型別對前面的表中的每一個記錄聯合進行完全掃描(比ALL更好,因為索引一般小於表資料)。
- ALL:這個連線型別對於前面的每一個記錄聯合進行完全掃描,這一般比較糟糕,應該儘量避免。