2012-11-16 10 views
5

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?

+0

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

+0

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

Trả lời

1

Chỉ cần để mở rộng nhận xét của tôi về OP

này rất có thể là một vấn đề bộ nhớ - đọc kết quả 12m vào bộ nhớ có thể gây ra phân trang trừ khi khách hàng có rất nhiều RAM. Ngay sau khi bạn bắt đầu đập đĩa, hiệu suất sẽ giảm đáng kể. Cần lưu ý rằng nếu bạn bắt đầu tăng RAM, JVM có một số điểm lạ về cách địa chỉ> 32G (nó chuyển sang con trỏ 64 bit) có nghĩa là khi bạn chuyển qua 32G, bạn thực sự mất bộ nhớ khả dụng và có thể có các vấn đề khác tùy thuộc vào về cách viết mã của bạn.

Để đưa mọi thứ vào quan điểm, chúng tôi đang sử dụng elasticsearch tại thời điểm này để lập chỉ mục ~ 60 triệu tài liệu. Phải thừa nhận rằng, việc sử dụng bộ nhớ sẽ có liên quan nhiều hơn vì nó xử lý các chỉ mục, cache, vv ... nhưng chúng tôi sẽ không xem xét cho nó ít hơn 16G RAM để có được phản hồi hiệu suất. Tôi đã gặp những người sử dụng> 100G mỗi phân đoạn cho các bộ thu âm thực sự lớn.