2013-05-09 66 views
0

對不起,無用的文本很多。最重要的東西是告訴最後3段:DMySQL查詢速度或行讀取

最近我們在客戶端服務器之一有一些MySQL問題。藍色的東西開始搖搖欲墜的MySQL進程的CPU。這個問題導致我們找到並優化錯誤的查詢,這是一個問題。

我在想優化會加快查詢速度(查詢執行所需的總時間)。但是,在優化了幾個查詢之後,我的同事開始同事開始抱怨某些查詢讀取了太多行,表中的所有行(如EX​​PLAIN所示)。

重寫一個查詢後,我注意到,如果我想查詢讀取較少的行 - 查詢速度受到影響,如果我查詢速度 - 讀取更多的行。

,但這並沒有讓我的感覺:更少的行閱讀,但執行時間較長

這讓我不知道應該做什麼。當然,如果快速查詢讀取最少的行,那將是完美的。但是,因爲它似乎不可能爲我,我正在尋找一些答案。我應該採用哪種方法 - 讀取速度更快或更少的行?什麼是&缺點當查詢是快速的,但有更多的行讀取和更少的行讀速度遭受?在不同情況下服務器會發生什麼?

Google搜索後,我可以找到所有關於如何提高速度的文章和討論,但都沒有涵蓋我之前提到的那些不同情況。

我期待着看到甚至個人選擇當然有一些推理。 可以直接指導我的鏈接也是受歡迎的。

+0

你的斷言並非總是如此。每種情況都有特異性。如果您根據您的業務需要設計*正確* SQL查詢*,那麼記錄集返回的行數無關緊要。 – Sebas 2013-05-09 18:26:56

回答

2

我認爲你的問題取決於你如何限制讀取的行數。如果你通過實現更多的MySQL需要運行的WHERE子句來讀取更少的行,那麼是的,性能將會受到影響。

我想看看可能將您的某些列編入索引,這會使您的搜索更加複雜。簡單的數據類型比複雜的查詢更快。看看你是否正在搜索索引列。

2

如果沒有更多的數據,我可以給你一些提示:

  1. 要確保你的表是正確索引。爲每個表創建適當的索引。同時刪除不需要的索引。
  2. 確定每個查詢的最佳方法。例如,如果僅使用group by來刪除重複數據行,則表示正在浪費資源;最好使用select distinct(在索引字段上)。
  3. 「分而治之」。你能在兩個,三個或更多的中間步驟中分解你的過程嗎?如果答案是「是」,那麼:您是否可以爲其中一些步驟創建臨時表?我已經使用臨時表分割了進程,並且它們對於加快速度非常有用。
2

無論如何,EXPLAIN報告的讀取行數是一個估計 - 不要把它作爲字面值。請注意,如果多次對相同的查詢運行EXPLAIN,則每次讀取的行數都會更改。這個估計甚至可能是完全不準確的,因爲時不時會有EXPLAIN中的錯誤。

在測試查詢時,另一種度量查詢性能的方法是SHOW SESSION STATUS LIKE 'Handler%'。這會告訴你準確的 SQL層向存儲引擎層對單個行發出請求的次數。例如,請參閱我的演示文稿SQL Query Patterns, Optimized

還有一個問題,請求的行是否已經在緩衝池中(我假設你使用InnoDB),或者查詢是否必須從磁盤讀取它們,引發I/O操作。從磁盤讀取的少量行可能比從RAM讀取的大量行慢幾個數量級。這並不一定解釋你的情況,但它指出可能發生這種情況,並且「行讀取」不會告訴你查詢是否導致了I/O。由於InnoDB的多版本化,甚至有可能是多個單行的I/O操作。

洞察邏輯行請求與物理I/O讀取之間的區別很難獲得。在Percona Server中,enhancements to the slow query log包含每個查詢的InnoDB I/O操作數。