MySQL Query時(shí)間都去哪兒了
MySQL作為被廣泛應(yīng)用的關(guān)系型數(shù)據(jù)庫(kù),幫助大家完成數(shù)據(jù)存儲(chǔ)、數(shù)據(jù)處理以及數(shù)據(jù)分析等相關(guān)工作。在使用MySQL過程中最常遇到的問題大約就是慢查詢或者運(yùn)算時(shí)間很長(zhǎng)的問題,那么時(shí)間都去哪兒了呢?
使用SHOW PROFILE
MySQL提供的 SHOW PROFILE語(yǔ)法 ,可以幫助我們分析查詢執(zhí)行的每個(gè)步驟極其花費(fèi)的時(shí)間。我們可以通過執(zhí)行 set profiling=1 來開啟此功能。先讓我們看個(gè)例子
- select count(*) from user;
- show profile;
通過show profile命令我們可以查看時(shí)間主要消耗在了Sending data階段,Sending data狀態(tài)描述的是讀和處理SELECT涉及的行以及發(fā)送數(shù)據(jù)到客戶端:
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)的解釋請(qǐng)參考 手冊(cè) 。通過分析查詢每個(gè)步驟消耗的時(shí)間,我們可以有針對(duì)性的進(jìn)行優(yōu)化。讓我們來查看另一個(gè)例子。
- select * from user order by email desc limit 1000, 10;
- show profiles;
- show profile for query 2;
通過上邊的例子,我們可以發(fā)現(xiàn)時(shí)間主要花到了排序上。
使用 EXPLAIN
我們可以使用EXPLAIN來獲取關(guān)于查詢執(zhí)行計(jì)劃的信息, EXPLAIN命令等價(jià)于DESCRIBE/DESC。EXPLAIN命令是查看查詢優(yōu)化器如何決定執(zhí)行查詢的主要方法。
EXPLAIN命令可以幫助我們查看查詢我們的SQL語(yǔ)句可能用到的索引(possible_keys)以及影響的行數(shù)(rows),可以幫我們更好的定位慢的原因。每列值得具體解釋請(qǐng)參考 手冊(cè) 。此外EXPLAIN也可以看表結(jié)構(gòu)。
目前MySQL提供的工具在分析查詢性能定位上還是比較弱的,但是造成查詢性能底下的原因還是比較明確的:就是訪問的數(shù)據(jù)太多。那么通過調(diào)整索引結(jié)構(gòu)、調(diào)整檢索語(yǔ)句的條件以及重構(gòu)查詢等均能收到不錯(cuò)的優(yōu)化效果。
通過上述兩個(gè)工具我們基本上能夠確定我們的SQL在干什么以及消耗了多少時(shí)間,也能夠了解查詢優(yōu)化器為我們做的一些工作,更具它們?yōu)槲覀兲峁┑男畔?,我們可以調(diào)整我的查詢方式來提高我們的查詢效率。