Mysql抵消无限行

我想构build一个查询,在一个表中显示所有的结果,但是从表的开始偏移5。 据我所知,MySQL的LIMIT需要一个限制和一个偏移量。 有没有办法做到这一点?

从LIMIT上的MySQL手册 :

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

 SELECT * FROM tbl LIMIT 95, 18446744073709551615; 

正如你所提到的,LIMIT是必需的,所以你需要使用最大的可能的限制,即18446744073709551615(最大的无符号BIGINT)

 SELECT * FROM somewhere LIMIT 18446744073709551610 OFFSET 5 

正如在其他答案中指出的,MySQLbuild议使用18446744073709551615作为限制logging的数量,但考虑这一点:如果你有18,446,744,073,709,551,615条logging,你会怎么做? 事实上,如果你有10亿条logging,你会怎么做?

也许你想要超过十亿条logging,但是我的观点是你想要的数量有一些限制,而且不到十亿分之一。 为了稳定性,优化性和可用性,我build议在查询上加一些有意义的限制。 这也可以减less任何人从来没有看过这个神奇的数字的困惑,并至less传达了你愿意一次处理多lesslogging的额外好处。

如果你真的必须从你的数据库中得到所有18条logging,也许你真正想要的是以1亿次的速度抓取它们,并循环1840亿次。

另一种方法是select一个自动增量列,然后使用HAVING进行过滤。

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

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

就在今天,我正在阅读从MySQL表中获取大量数据(超过一百万行)的最佳方法。 一种方法是,如所build议的那样,使用LIMIT x,y ,其中x是偏移量, y是要返回的最后一行。 但是,我发现,这不是最有效的方式。 如果你有一个自动增量列,你可以很容易地使用一个带有WHERE子句的SELECT语句来说明你想从哪个logging开始。

例如, SELECT * FROM table_name WHERE id > x;

看起来,当你使用LIMIT时,mysql会得到所有的结果,然后只显示适合偏移量的logging:不是最好的性能。

来源:这个问题的答案MySQL论坛 。 请注意,问题是大约6岁。

你可以使用LIMIT的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; 

testing在MySQL 5.5.44。 因此,我们可以避免插入数字18446744073709551615。

注意:事务确保variables@rows与执行语句中考虑的表格一致。

我知道这是旧的,但我没有看到类似的回应,所以这是我将使用的解决scheme。

首先,我将在表上执行计数查询以查看存在多lesslogging。 这个查询很快,通常执行时间可以忽略不计。 就像是:

 SELECT COUNT(*) FROM table_name; 

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

 SELECT * FROM table_name LIMIT count_result OFFSET desired_offset; 

或者可能是这样的:

 SELECT * FROM table_name LIMIT desired_offset, count_result; 

当然,如果有必要的话,你可以从count_result中减去desired_offset得到一个实际的,准确的值作为限​​制。 如果我真的可以确定一个合适的限制,传递“18446744073709551610”值是没有意义的。

使用这个其他问题并将这个技巧与Greg的答案合并,可以使用〜0来代替最大的unsigned bigint值:

 SELECT * FROM tbl LIMIT ~0 OFFSET 95; 

要么

 SELECT * FROM tbl LIMIT 95, ~0; 
 WHERE .... AND id > <YOUROFFSET> 

ID可以是任何自动增量或唯一的数字列,你有…