MySQL Query時間都去哪兒了
MySQL作為被廣泛應用的關系型數據庫,幫助大家完成數據存儲、數據處理以及數據分析等相關工作。在使用MySQL過程中最常遇到的問題大約就是慢查詢或者運算時間很長的問題,那么時間都去哪兒了呢?
使用SHOW PROFILE
MySQL提供的 SHOW PROFILE語法 ,可以幫助我們分析查詢執(zhí)行的每個步驟極其花費的時間。我們可以通過執(zhí)行 set profiling=1 來開啟此功能。先讓我們看個例子
- select count(*) from user;
- show profile;
通過show profile命令我們可以查看時間主要消耗在了Sending data階段,Sending data狀態(tài)描述的是讀和處理SELECT涉及的行以及發(fā)送數據到客戶端:
The thread is reading and processing rows for a SELECT statement, and sending data to the client. Because operations occurring during this state tend to perform large amounts of disk access (reads), it is often the longest-running state over the lifetime of a given query.
其他狀態(tài)的解釋請參考 手冊 。通過分析查詢每個步驟消耗的時間,我們可以有針對性的進行優(yōu)化。讓我們來查看另一個例子。
- select * from user order by email desc limit 1000, 10;
- show profiles;
- show profile for query 2;
通過上邊的例子,我們可以發(fā)現時間主要花到了排序上。
使用 EXPLAIN
我們可以使用EXPLAIN來獲取關于查詢執(zhí)行計劃的信息, EXPLAIN命令等價于DESCRIBE/DESC。EXPLAIN命令是查看查詢優(yōu)化器如何決定執(zhí)行查詢的主要方法。
EXPLAIN命令可以幫助我們查看查詢我們的SQL語句可能用到的索引(possible_keys)以及影響的行數(rows),可以幫我們更好的定位慢的原因。每列值得具體解釋請參考 手冊 。此外EXPLAIN也可以看表結構。
目前MySQL提供的工具在分析查詢性能定位上還是比較弱的,但是造成查詢性能底下的原因還是比較明確的:就是訪問的數據太多。那么通過調整索引結構、調整檢索語句的條件以及重構查詢等均能收到不錯的優(yōu)化效果。
通過上述兩個工具我們基本上能夠確定我們的SQL在干什么以及消耗了多少時間,也能夠了解查詢優(yōu)化器為我們做的一些工作,更具它們?yōu)槲覀兲峁┑男畔ⅲ覀兛梢哉{整我的查詢方式來提高我們的查詢效率。