2011-02-08 81 views
9

當我做我的查詢的解釋擺脫的「使用臨時;使用文件排序」

enter image description here

我看到它的「使用臨時;使用文件排序」下的「額外」的第一行。我知道這很糟糕,但我不知道它究竟意味着什麼或如何解決它。

如果你想看到我的查詢,這裏有一個更普遍的問題,我問相同的查詢:MySQL query optimization and EXPLAIN for a noob。 作爲參考,查詢涉及24個表和23個連接。

我的問題,現在:

  • 什麼是「使用臨時」和「使用文件排序」是什麼意思?
  • 假設他們是壞人,我該如何擺脫他們?
+1

我認爲這意味着「查詢優化器不能使用表中的索引來檢索最終順序中的數據;結果集對於內存來說可能太大;因此,中間結果將存儲在一個文件,然後排序「。當DBMS使用臨時文件並對它們進行排序時,它並不會自動壞;它可能是回答查詢的最佳方法(優化器認爲它是)。 – 2011-02-08 16:22:53

回答

7

如前所述,「使用filesort」和「using temporary」並不總是意味着糟糕的性能。

Here是提高ORDER的表現BY語句一些基本準則。亮點:

如果您想提高ORDER BY速度,請檢查您是否可以讓MySQL使用索引而不是額外的排序階段。如果這不可行,您可以嘗試以下策略:

增加 sort_buffer_size變量的大小。

增長的 read_rnd_buffer_size變量的大小。通過聲明列只有那麼大,他們需要持有其中存儲的值每行

使用較少的內存。例如,如果值不超過16個字符,則CHAR(16)優於CHAR(200)。

首先嚐試使用索引(確保您通過索引排序的字段)。請注意,增加系統變量sort_buffer_sizeread_rnd_buffer_size也會對其他查詢產生負面影響 - 可以考慮將它們專門設置爲您需要的會話,並將其保留爲所有其他會話的默認會話。