MySQL查詢分析與優化
Show www.2cto.com
show status ——顯示狀態信息(擴展show status like ‘XXX’)
show variables ——顯示系統變量(擴展show variables like ‘XXX’)
show engine innodb status ——顯示InnoDB存儲引擎的狀態
show processlist ——查看當前SQL執行,包括執行狀態、是否鎖表等
mysqladmin variables -u username -p password——顯示系統變量
mysqladmin extended-status -u username -p password——顯示狀態信息
Explain
Table:顯示這一行的數據是關於哪張表的
possible_keys:顯示可能應用在這張表中的索引。如果為空,沒有可能的索引。可以為相關的域從WHERE語句中選擇一個合適的語句
www.2cto.com
key:實際使用的索引。如果為NULL,則沒有使用索引。MYSQL很少會選擇優化不足的索引,此時可以在SELECT語句中使用USE INDEX(index)來強制使用一個索引或者用IGNORE INDEX(index)來強制忽略索引
key_len:使用的索引的長度。在不損失精確性的情況下,長度越短越好
ref:顯示索引的哪一列被使用了,如果可能的話,是一個常數
rows:MySQL認為必須檢索的用來返回請求數據的行數
type:這是最重要的字段之一,顯示查詢使用了何種類型。從最好到最差的連接類型為system、const、eq_reg、ref、range、index和ALL
system、const:可以將查詢的變量轉為常量. 如id=1; id為 主鍵或唯一鍵.
eq_ref:訪問索引,返回某單一行的數據.(通常在聯接時出現,查詢使用的索引為主鍵或惟一鍵)
ref:訪問索引,返回某個值的數據.(可以返回多行) 通常使用=時發生
range:這個連接類型使用索引返回一個范圍中的行,比如使用>或<查找東西,並且該字段上建有索引時發生的情況(注:不一定好於index)
index:以索引的順序進行全表掃描,優點是不用排序,缺點是還要全表掃描
ALL:全表掃描,應該盡量避免
Extra:關於MYSQL如何解析查詢的額外信息,主要有以下幾種
using index:只用到索引,可以避免訪問表.
using where:使用到where來過慮數據. 不是所有的where clause都要顯示using where. 如以=方式訪問索引.
using tmporary:用到臨時表
using filesort:用到額外的排序. (當使用order by v1,而沒用到索引時,就會使用額外的排序)
range checked for eache record(index map:N):沒有好的索引.
Profiling
打開功能: mysql>set profiling=1;
show profiles; 可以得到被執行的SQL語句的時間和ID
show profile for query 1; 得到對應SQL語句執行的詳細信息
測試完畢以後 ,關閉參數:mysql> set profiling=0