row in set ( sec)
注意keyrows和Extra這三項這條語句返回的結果說明了該sql會使用PRIMARY主鍵索引來查詢結果集數量為條Extra沒有顯示證明沒有用到排序或其他操作由此結果可以推斷mysql會從索引中查詢imgid=這條記錄然後再到真實表中取出所有字段是很簡單的操作key是指明當前sql會使用的索引mysql執行一條簡單語句時只能使用到一條索引注意這個限制rows是返回的結果集大小結果集就是使用該索引進行一次搜索的所有匹配結果Extra一般會顯示查詢和排序的方式如果沒有使用到key或者rows很大而用到了filesort排序一般都會影響到效率例如
mysql> desc select * from imgs where userid=mini order by clicks desc limit ;
row in set ( sec)
這條sql結果集會有條用到了filesort所以執行起來會非常消耗效率的這時mysql執行時會把整個表掃描一遍一條一條去找到匹配userid=mini的記錄然後還要對這些記錄的clicks進行一次排序效率可想而知真實執行時如果發現還比較快的話那是因為服務器內存還足夠將條比較短小的記錄全部讀入內存所以還比較快但是並發多起來或者表大起來的話效率問題就嚴重了這時我把userid加入索引create index userid on imgs (userid);然後再檢查
mysql> desc select * from imgs where userid=mini order by clicks desc limit ;
row in set ( sec)
[] [] [] [] [] []
From:http://tw.wingwit.com/Article/program/MySQL/201311/29772.html