2011-03-15 61 views
2

我有一個大的MySQL表(大約7.5億行),我只想提取幾列。在查詢完成之前,我可以強制MySQL輸出結果嗎?

SELECT id, delid FROM tbl_name; 

沒有加入或選擇標準或任何東西。這兩個字段都有一個索引(分開)。

原則上,它可能剛剛開始閱讀表格並立即將值分發出去,但實際上整個系統只是咀嚼記憶並基本上停下來。

好像正在執行整個查詢,併產生的任何輸出前,輸出保存在某個地方......

我搜索上unbuffering,關閉緩存等,但就是無法找到答案。

(mysqldump的是幾乎什麼,我想,除了它轉儲整個表 - 但至少它只是將立即開始產生輸出)

+0

什麼是你與7.5億行2列做準備?這些列中存儲了什麼以及它們是什麼類型的存儲?你的數據庫服務器有多少內存?你的處理代碼寫入了多少內存/哪種語言? – P4ul 2011-03-15 07:52:37

+0

刪除重複項(使用UNIX排序)並將它們放回到另一個表中。服務器只有4Gb RAM,但我不明白爲什麼它需要RAM,除非有一些要求必須在發出之前存儲整個輸出。 – 2011-03-15 07:55:16

回答

3

你看着load data infileselect into

我認爲下面是接近你想要做什麼:

select id,delid 
    into outfile 'C:\\ronnis.csv' 
     fields terminated by ',' 
    from tbl_name; 

<perform unix sort> 

load data infile 'C:\\ronnis.csv' 
into table new_tbl_name 
fields terminated by ','; 
+0

Hurray ....這可以做到這一點(儘管我必須創建一個可寫入服務器的世界可寫目錄)。無緩衝輸出立即出現在指定的文件中。 – 2011-03-15 08:29:32

0

我能想到的是手工做這個有限制嘛。我不知道總共會有多少速度提升,但至少您的結果集會更小。另一方面,你將不得不處理幾個查詢,這可能會使這個問題變得很糟糕。

你可以使用一個unbuffered query,但你不能其他查詢「忙裏偷閒」,而這是在運行,我不知道這是否是在你的情況下,sollution

+0

我是這個數據集的唯一用戶,所以沒有數據庫無法訪問的問題。但是「unbuffered_query」是一個PHP而不是MySQL語句。 – 2011-03-15 08:00:55

+0

就是這樣,但最終你使用的是一個'客戶'連接到你的數據庫,並且php-as-a-client支持這種返回結果集的方式。但這只是一個想法。 – Nanne 2011-03-15 08:49:32

相關問題