2011-09-23 114 views
52

我有一個大的MySQL查詢的問題。是否有可能跳過拷貝到磁盤上的tmp表中步驟mysql是否需要進行大型查詢,還是有可能使其更快?因爲這一步驟太長以至於無法將我的查詢結果返回。我在MySQL頁面上讀到了這一點,即mysql執行此操作以節省內存,但我不在意節省內存。我只想將查詢結果返回FAST,我的計算機上有足夠的內存。此外,我的表格已正確編制索引,因此這不是我的查詢速度緩慢的原因。跳過複製到磁盤上的tmp表mysql mysql

任何幫助?

謝謝

+0

我不是MySql的專家,但你可能更適合優化查詢和/或架構。 – mxmissile

+8

我投票結束這個「不是真正的問題」。問題不包括要優化的SQL查詢,也不包括「SHOW CREATE TABLE」來顯示哪些索引,也不包含顯示當前優化計劃的「EXPLAIN」報告。 –

+2

我必須同意@Bill Karwin需要查看查詢,創建表語句和/或EXPLAIN計劃。我的答案會解決你所看到的問題,但允許錯誤的查詢來擴充RAM。瞭解你的查詢的性質可能會消除重新配置RAM或MySQL的需要。 – RolandoMySQLDBA

回答

78

有兩件事情可以做,以減輕該

選項#1的影響:增加變量tmp_table_size和/或max_heap_table_size

這些選項將決定如何內存中的臨時表可能會在它被認爲太大之前存在,然後作爲臨時MyISAM表分頁到磁盤。這些值越大,您將越難「複製到磁盤上的tmp表」。請確保您的服務器有足夠的RAM,並且max_connections適度配置,如果單個數據庫連接需要大量的RAM用於其自己的臨時表。

選項2:使用RAM磁盤tmp目錄表

你應該能夠在Linux中配置一個RAM磁盤,然後設置tmpdir在MySQL中是具有RAM磁盤安裝的文件夾。

對於初學者來說,在OS

創建名爲/ var在Linux的文件夾配置RAM磁盤/ tmpfs的

mkdir /var/tmpfs 

接下來,該行添加到/ etc/fstab文件(例如,如果你想要一個16GB的RAM盤)

none     /var/tmpfs    tmpfs defaults,size=16g  1 2 

並重新啓動服務器。

注意:可以在不重新啓動的情況下製作RAM磁盤。請記住,在服務器重新啓動後,仍然將上述行添加到/ etc/fstab以使RAM磁盤有效。

現在對MySQL:

加入這一行的/etc/my.cnf

[mysqld] 
tmpdir=/var/tmpfs 

和重啓MySQL。

選項#3:獲取TMP表到RAM磁盤的ASAP(假設你申請OPTION#2首)

您可能希望儘快讓MySQL的做強制TMP表到RAM盤不會將其輪子遷移到RAM磁盤中,將大型內存中的tmp表遷移。只需將其添加到/etc/my.cnf:

[mysqld] 
tmpdir=/var/tmpfs 
tmp_table_size=2K 

並重新啓動mysql。這將導致即使是最小的臨時表也被存入RAM磁盤中。您可以定期運行ls -l /var/tmpfs來觀看臨時表來去。

試試吧!

CAVEAT

如果你看到的只是臨時表,在/ var/tmpfs的24/7,這可能會影響操作系統的功能/性能。爲了確保/ var/tmpfs不會過多,請調整您的查詢。一旦你這樣做了,你應該會在/ var/tmpfs中看到更少的tmp表。

+5

其他幾點,如果你在Linux上(特別是Ubuntu) 你可能需要添加你的tmpdir路徑到(/etc/apparmor.d/usr.sbin.mysqld)應用程序裝甲 也不要忘記chmod 777的目錄以及! – Dan

+0

當我嘗試在ubuntu燈服務器上嘗試重新啓動mysql時,我的作業無法啓動。然後我將它切換回默認的/ tmp並且它可以正常啓動。 @Dan你可以給你添加到user.sbin.mysqld的一個例子嗎?謝謝 – vikingben

+0

僅供參考,除了添加/etc/apparmor.d/usr/sbin.mysqld之外,我還必須在ubuntu上執行以下操作,我必須添加到/etc/apparmor.d/abstractions/user-tmp以及添加與原始tmp文件夾相同的格式。 – vikingben