Chúng tôi có một bảng innodb với 12.000.000 hồ sơ.Quét bảng mysql, tại sao tìm nạp tập kết quả từng hàng nhanh hơn nhiều so với việc truy xuất chúng trong bộ nhớ hoàn toàn?
Tôi sử dụng hai cách để SELECT *
từ bảng này bằng cách sử dụng JDBC.
Statement stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,java.sql.ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);
Cách này cho phép trình điều khiển phát trực tuyến tập kết quả theo từng hàng và phải mất 7 giây để hoàn tất quá trình quét.
Statement stmt =conn.createStatement();
resultsets được hoàn toàn lấy ra và lưu trữ trong memory.And cách này mất 21s!
Chỉ cần cảm thấy bối rối, tại sao tìm nạp hàng tập kết quả theo hàng nhanh hơn lấy bộ kết quả đã hoàn thành vào bộ nhớ máy khách? Cách xếp hàng theo hàng không mất nhiều thời gian hơn cho việc chuyển mạng?
Máy chủ "khách hàng" có bộ nhớ bao nhiêu bộ nhớ? với các bản ghi 12 triệu, có một cơ hội tốt để đọc tất cả mọi thứ vào bộ nhớ sẽ gây ra phân trang và đĩa khởi động từ đó có thể là đáng kể. – Basic
jvm của khách hàng có bộ nhớ 2G, jvm args là "-server -Xms2g -Xmx2g -Xss256K". Và sau khi tôi cung cấp cho nó 4G cho jvm, việc đọc tất cả resultset vào bộ nhớ chỉ mất 11s. Có vẻ như là khách hàng cần nhiều hơn 3G jvm, kích thước jvm nhỏ thực sự gây ra phân trang và đĩa khuấy. – IvyTang