START TRANSACTION;
SET @my_offset = 5;
SET @rows = (SELECT COUNT(*) FROM my_table);
PREPARE statement FROM 'SELECT * FROM my_table LIMIT ? OFFSET ?';
EXECUTE statement USING @rows, @my_offset;
COMMIT;
就在今天,我读到了从mysql表获取大量数据(超过一百万行)的最佳方法。一种方法是,如建议的那样,使用 LIMIT x,y 哪里 x 是偏移量和 y 要返回的最后一行。然而,我发现,这并不是最有效的方法。如果您有一个自动递增列,那么可以使用 SELECT 带有 WHERE 从句中说明要从哪个记录开始。 例如, SELECT * FROM table_name WHERE id > x; 当你使用mysql时,它似乎得到了所有的结果 LIMIT 然后只显示符合偏移量的记录:不是性能最佳的记录。 来源:mysql论坛对这个问题的回答。请注意,这个问题有6年了。
9条答案
按热度按时间fv2wmkja1#
正如其他人提到的,来自mysql手册。为了实现这一点,可以使用无符号大整数的最大值,也就是这个可怕的数字(18446744073709551615)。但是为了使它不那么混乱,可以使用tilde“~”逐位运算符。
它的工作原理是按位求反。“~0”的结果是18446744073709551615。
oymdgrw72#
正如在其他答案中提到的,mysql建议使用18446744073709551615作为限制中的记录数,但是请考虑以下问题:如果您得到了18446744073709551615条记录,您会怎么做?事实上,如果你有100000000张唱片你会怎么做?
也许你真的想要10亿张以上的唱片,但我的观点是,你想要的唱片数量是有限制的,不到1850万张。为了稳定性、优化以及可能的可用性,我建议对查询进行一些有意义的限制。这也会减少那些从未见过这个神奇数字的人的困惑,而且还有一个额外的好处,那就是至少可以告诉他们你愿意一次处理多少条记录。
如果您真的必须从数据库中获取所有18个5亿条记录,那么您真正想要的可能是以1亿的增量获取它们并循环1840亿次。
k3bvogb13#
我知道这是旧的,但我没有看到类似的React,所以这是我将使用的解决方案。
首先,我将对表执行count查询,以查看存在多少条记录。这个查询速度很快,通常执行时间可以忽略不计。比如:
然后,我将使用count得到的结果作为我的限制来构建查询(因为这是表可能返回的最大行数)。比如:
或者可能是这样的:
当然,如果需要的话,您可以从count\结果中减去所需的\偏移量,以得到一个实际的、准确的值作为限制。如果我真的能确定一个合适的限制来提供,那么传递“18446744073709551610”值就没有意义了。
33qvvth14#
另一种方法是选择一个自动增加的列,然后使用having对其进行过滤。
但我可能会坚持高限方法。
kg7wmglp5#
从mysql手册的限制:
要检索从某个偏移量到结果集末尾的所有行,可以使用一些大的数字作为第二个参数。此语句检索从第96行到最后一行的所有行:
2admgd596#
正如您提到的,limit是必需的,因此您需要使用可能的最大限制,即18446744073709551615(unsigned bigint的最大值)
w8biq8rn7#
您可以使用具有以下限制的mysql语句:
在MySQL5.5.44中测试。因此,我们可以避免插入数字18446744073709551615。
注意:事务确保变量@rows与语句执行中考虑的表一致。
pdkcd3nj8#
id可以是任何自动递增的或唯一的数字列。。。
bttbmeg09#
就在今天,我读到了从mysql表获取大量数据(超过一百万行)的最佳方法。一种方法是,如建议的那样,使用
LIMIT x,y
哪里x
是偏移量和y
要返回的最后一行。然而,我发现,这并不是最有效的方法。如果您有一个自动递增列,那么可以使用SELECT
带有WHERE
从句中说明要从哪个记录开始。例如,
SELECT * FROM table_name WHERE id > x;
当你使用mysql时,它似乎得到了所有的结果LIMIT
然后只显示符合偏移量的记录:不是性能最佳的记录。来源:mysql论坛对这个问题的回答。请注意,这个问题有6年了。