您可以尝试使用LIMIT
特征。如果你这样做:
SELECT * FROM MyTable ORDER BY whatever LIMIT 0,1000
您将获得前 1,000 行。首先LIMIT
值 (0) 定义结果集中的起始行。它是零索引的,因此 0 表示“第一行”。第二LIMIT
value 是要检索的最大行数。要获取接下来的几组 1,000 个,请执行以下操作:
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
等等。当。。。的时候SELECT
不返回任何行,您就完成了。
但这本身还不够,因为在一次处理 1K 行时对表所做的任何更改都会打乱顺序。要及时冻结结果,首先将结果查询到临时表中:
CREATE TEMPORARY TABLE MyChunkedResult AS (
SELECT *
FROM MyTable
ORDER BY whatever
);
旁注:最好事先确保临时表不存在:
DROP TEMPORARY TABLE IF EXISTS MyChunkedResult;
无论如何,一旦临时表就位,就可以从那里提取行块:
SELECT * FROM MyChunkedResult LIMIT 0, 1000;
SELECT * FROM MyChunkedResult LIMIT 1000,1000;
SELECT * FROM MyChunkedResult LIMIT 2000,1000;
.. and so on.
我将让您创建逻辑来计算每个块之后的限制值并检查结果的结尾。我还建议使用比 1,000 条记录大得多的块;这只是我凭空挑选的一个数字。
最后,完成后删除临时表是一种很好的形式:
DROP TEMPORARY TABLE MyChunkedResult;