Bạn có thể thử sử dụng LIMIT
tính năng. Nếu bạn làm điều này:
SELECT * FROM MyTable ORDER BY whatever LIMIT 0,1000
Bạn sẽ nhận được 1.000 hàng đầu tiên. LIMIT
đầu tiên giá trị (0) xác định hàng bắt đầu trong tập kết quả. Nó được lập chỉ mục bằng 0, vì vậy 0 có nghĩa là "hàng đầu tiên". LIMIT
thứ hai giá trị là số hàng tối đa để truy xuất. Để nhận được một vài bộ 1.000 tiếp theo, hãy làm như sau:
SELECT * FROM MyTable ORDER BY whatever LIMIT 1000,1000 -- rows 1,001 - 2,000
SELECT * FROM MyTable ORDER BY whatever LIMIT 2000,1000 -- rows 2,001 - 3,000
Và như thế. Khi SELECT
không trả về hàng nào, bạn đã hoàn tất.
Tuy nhiên, điều này là không đủ, bởi vì bất kỳ thay đổi nào được thực hiện đối với bảng trong khi bạn đang xử lý 1K hàng của mình cùng một lúc sẽ không phù hợp với thứ tự. Để cố định kết quả trong thời gian, hãy bắt đầu bằng cách truy vấn kết quả vào một bảng tạm thời:
CREATE TEMPORARY TABLE MyChunkedResult AS (
SELECT *
FROM MyTable
ORDER BY whatever
);
Lưu ý phụ:bạn nên đảm bảo rằng bảng tạm thời không tồn tại trước:
DROP TEMPORARY TABLE IF EXISTS MyChunkedResult;
Bằng mọi giá, khi đã có bảng tạm thời, hãy kéo các phần hàng từ đó:
SELECT * FROM MyChunkedResult LIMIT 0, 1000;
SELECT * FROM MyChunkedResult LIMIT 1000,1000;
SELECT * FROM MyChunkedResult LIMIT 2000,1000;
.. and so on.
Tôi sẽ giao nó cho bạn để tạo logic sẽ tính toán giá trị giới hạn sau mỗi đoạn và kiểm tra kết quả cuối cùng. Tôi cũng muốn giới thiệu nhiều phần lớn hơn 1.000 bản ghi; đó chỉ là một con số tôi chọn ra.
Cuối cùng, đây là một hình thức tốt để bỏ bảng tạm thời khi bạn hoàn thành:
DROP TEMPORARY TABLE MyChunkedResult;