mysql偏移无限行

hm2xizp9  于 2021-06-17  发布在  Mysql
关注(0)|答案(9)|浏览(314)

我想构造一个查询,显示一个表中的所有结果,但从表的开头偏移5。据我所知,mysql的 LIMIT 需要限制和偏移量。有什么办法吗?

z9zf31ra

z9zf31ra1#

就在今天,我读到了从mysql表获取大量数据(超过一百万行)的最佳方法。一种方法是,如建议的那样,使用 LIMIT x,y 哪里 x 是偏移量和 y 要返回的最后一行。然而,我发现,这并不是最有效的方法。如果您有一个自动递增列,那么可以使用 SELECT 带有 WHERE 从句中说明要从哪个记录开始。
例如, SELECT * FROM table_name WHERE id > x; 当你使用mysql时,它似乎得到了所有的结果 LIMIT 然后只显示符合偏移量的记录:不是性能最佳的记录。
来源:mysql论坛对这个问题的回答。请注意,这个问题有6年了。

3okqufwl

3okqufwl2#

从mysql手册的限制:
要检索从某个偏移量到结果集末尾的所有行,可以使用一些大的数字作为第二个参数。此语句检索从第96行到最后一行的所有行:

SELECT * FROM tbl LIMIT 95, 18446744073709551615;
sg24os4d

sg24os4d3#

WHERE .... AND id > <YOUROFFSET>

id可以是任何自动递增的或唯一的数字列。。。

qeeaahzv

qeeaahzv4#

另一种方法是选择一个自动增加的列,然后使用having对其进行过滤。

SET @a := 0; 
select @a:=@a + 1 AS counter, table.* FROM table 
HAVING counter > 4

但我可能会坚持高限方法。

3okqufwl

3okqufwl5#

正如您提到的,limit是必需的,因此您需要使用可能的最大限制,即18446744073709551615(unsigned bigint的最大值)

SELECT * FROM somewhere LIMIT 18446744073709551610 OFFSET 5
pepwfjgg

pepwfjgg6#

正如在其他答案中提到的,mysql建议使用18446744073709551615作为限制中的记录数,但是请考虑以下问题:如果您得到了18446744073709551615条记录,您会怎么做?事实上,如果你有100000000张唱片你会怎么做?
也许你真的想要10亿张以上的唱片,但我的观点是,你想要的唱片数量是有限制的,不到1850万张。为了稳定性、优化以及可能的可用性,我建议对查询进行一些有意义的限制。这也会减少那些从未见过这个神奇数字的人的困惑,而且还有一个额外的好处,那就是至少可以告诉他们你愿意一次处理多少条记录。
如果您真的必须从数据库中获取所有18个5亿条记录,那么您真正想要的可能是以1亿的增量获取它们并循环1840亿次。

eanckbw9

eanckbw97#

您可以使用具有以下限制的mysql语句:

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;

在MySQL5.5.44中测试。因此,我们可以避免插入数字18446744073709551615。
注意:事务确保变量@rows与语句执行中考虑的表一致。

blpfk2vs

blpfk2vs8#

正如其他人提到的,来自mysql手册。为了实现这一点,可以使用无符号大整数的最大值,也就是这个可怕的数字(18446744073709551615)。但是为了使它不那么混乱,可以使用tilde“~”逐位运算符。

LIMIT 95, ~0

它的工作原理是按位求反。“~0”的结果是18446744073709551615。

ax6ht2ek

ax6ht2ek9#

我知道这是旧的,但我没有看到类似的React,所以这是我将使用的解决方案。
首先,我将对表执行count查询,以查看存在多少条记录。这个查询速度很快,通常执行时间可以忽略不计。比如:

SELECT COUNT(*) FROM table_name;

然后,我将使用count得到的结果作为我的限制来构建查询(因为这是表可能返回的最大行数)。比如:

SELECT * FROM table_name LIMIT count_result OFFSET desired_offset;

或者可能是这样的:

SELECT * FROM table_name LIMIT desired_offset, count_result;

当然,如果需要的话,您可以从count\结果中减去所需的\偏移量,以得到一个实际的、准确的值作为限制。如果我真的能确定一个合适的限制来提供,那么传递“18446744073709551610”值就没有意义了。

相关问题