2013-05-13 48 views
0

我使用mysql與jdbc。我需要遍歷表中的每一行(60,000行,table = InnoDB),並對每個行進行一些處理。選擇表中的每一行而不使用限制?

請問mysql會接受一個沒有限制的查詢嗎?在最簡單的實現,我只是選擇整個表格,並保持迭代的結果,而光標給了我更多的結果:

PreparedStatement stmt = conn.prepareStatement("SELECT * FROM foo"); 
ResultSet rs = stmt.getResultSet(); 
while (rs.next()) { 
    .. do stuff on each row .. 
} 

我可以實現課程的分頁查詢做到這一點分批,但它會如第一種方法所述那樣簡單。我想知道mysql是否在內部執行此操作,或者它試圖首先將整個查詢結果集加載到內存中?

感謝

+0

它將所有內容加載起來,如果感覺像它一樣會炸掉內存 – Drew 2013-05-13 03:41:48

+1

_「請問mysql會接受一個沒有這種限制的查詢嗎?」_爲什麼不呢?你爲什麼不嘗試一下,看看? – 2013-05-13 03:42:55

+0

@DrewPierce將fetchsize設置爲'Integer.MIN_VALUE'不會讓你的內存受到MySQL JDBC的影響。 – 2013-05-13 10:51:13

回答

0

MySQL是要運行它,並盡力肯定的,或者至少嘗試使用我們的記憶中,直到它用完。這也是其他幾點中有趣的亮點:

  1. 即使使用LIMIT,MySQL分析器仍然會在您的表中執行全面掃描。在此過程之後LIMIT運行在一個級別;
  2. MySQL會嘗試使用你的內存,如果它不夠用,解析器將它交換到文件系統,這在性能方面要慢得多和昂貴;
  3. 嘗試使用索引和WHERE CLAUSE充分利用查詢。當然你不需要把所有的東西都帶到你的應用程序層;

祝你好運!

+0

如果沒有ORDER等(如帖子中所示),RDBMS可以自由地從表格中返回所有結果,幾乎可以選擇任何順序 - 通常是物理佈局。同樣,如果在這裏提供了LIMIT *,那麼RDBMS可以自由地以任何它選擇的方式返回所述行數(但不多於)。如果沒有WHERE/ORDER/GROUP/etc子句,那麼索引不適用,因此沒有必要對「表掃描」進行重讀 - 它只需讀取數據即可返回。 – user2246674 2013-05-13 03:59:59

相關問題