網站或服務的性能關鍵點很大程度在于數據庫的設計(假設你選擇了合適的語言開發框架)以及如何查詢數據上。
我們知道MySQL的性能優化方法,一般有建立索引、規避復雜聯合查詢、設置冗余字段、建立中間表、查詢緩存等,也知道用EXPLAIN來查看執行計劃。
但對MySQL復雜查詢語句執行過程和內部機制,MySQL Optimizer本身所做優化以及查詢語句調整對性能所產生的影響及其原因知之甚少。
本文試圖對其中的一些關鍵概念如執行過程、索引使用等做比較深入的探討,知其然,知其所以然,
這樣可以避免在原本通過MySQL簡單優化就能獲得很好效果的情況下,盲目跟風轉向NoSQL存儲或者投入資金升級基礎設施。
工欲善其事,必先利其器,這里首先介紹MySQL查詢語句性能分析工具。
MySQL的EXPLAIN命令是用來分析查詢性能的工具,EXPLAIN的輸出每一行對應于查詢語句中的一張表的執行計劃說明,其輸出列含義如下表:

上表中type列是表關聯類型,常見的有如下類型(按關聯查詢效率從高到低排列):
const(常量連接),比如SELECT * FROM user WHERE id=1;
eq_ref(等值引用),比如SELECT * FROM user,card WHERE user.id=card.userid;
ref(引用),用于非唯一索引,比如SELECT * FROM user,card WHERE user.last_name='test';
range(范圍),比如SELECT * FROM tbl_name WHERE key_column > 10;
index(索引),根據索引來讀取數據,如果索引已包含了查詢數據,只需掃描索引樹,否則執行全表掃描和All類似;
ALL(所有),全表掃描
key列代表索引(index),rows表示估計會掃描多少行記錄,
Extra表示附加信息,常見的有如下幾種(也按查詢效率從高到低排列):
Using index:表示使用索引,如果同時出現Using where,代表使用索引來查找讀取記錄,如果沒有Using where,表示索引包含查詢數據,無需額外的查找;
Using where:表示條件查詢,如果type列是ALL或index,而沒有出現該信息,則你有可能在執行錯誤的查詢:返回所有數據;
Using filesort:不是“使用文件索引”的含義!filesort是MySQL所實現的一種排序策略,通常在使用到排序語句ORDER BY的時候,會出現該信息;
Using temporary:表示為了得到結果,使用了臨時表,這通常是出現在多表聯合查詢,結果排序的場合;
如果EXPLAIN出現后面兩個信息(Using filesort,Using temporary),而rows又比較大,通常意味著你需要調整查詢語句,或者需要添加索引,總之需要盡量消除這兩個信息。
下面給出EXPLAIN結果實例(從用戶檔案表中找出昵稱和性別,按用戶表中的用戶關注者數量排序):

上面的查詢語句就是典型的問題案例,Using filesort和Using temporary的具體含義以及如何優化上述語句放在下一篇文章中結合查詢過程和原理來專門討論。
以上就是本篇文章的全部內容了,希望對各位有所幫助。如果大家還有其他方面的問題,可以留言交流,請持續關注腳本之家!
您可能感興趣的文章:- 淺談pymysql查詢語句中帶有in時傳遞參數的問題
- MySQL模糊查詢語句整理集合
- MySQL查詢語句簡單操作示例
- PHP使用mysqli同時執行多條sql查詢語句的實例
- mysql基礎架構教程之查詢語句執行的流程詳解
- MySql帶OR關鍵字的多條件查詢語句
- Mysql帶And關鍵字的多條件查詢語句
- 詳解MySQL的limit用法和分頁查詢語句的性能分析
- php mysqli查詢語句返回值類型實例分析
- MySQL查詢語句大全集錦
- 最全的mysql查詢語句整理
- Oracle、MySQL和SqlServe三種數據庫分頁查詢語句的區別介紹
- 詳解MySQL 查詢語句的執行過程