12,000,000 以上のレコードを持つ innodb テーブルがあります。
SELECT *
JDBC を使用して、このテーブルから2 つの方法を使用します。
Statement stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,java.sql.ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);
この方法により、ドライバーは結果セットを行ごとにストリーミングでき、スキャンが完了するまでに 7 秒かかります。
Statement stmt =conn.createStatement();
ResultSet は完全に取得され、メモリに保存されます。この方法には 21 秒かかります。
結果セットを 1 行ずつフェッチする方が、完成した結果セットをクライアント メモリに取得するよりも速いのはなぜでしょうか。行ごとの方法は、ネットワーク転送に時間がかかるべきではありませんか?