我有一个非常大的表来检索记录。我正在使用MySQL。为了避免内存不足异常,我们需要使用 JDBC 将检索结果一一删除,或者使用 limit
查询中的子句。
因此,要检索完整的结果集,我们必须执行以下操作:
select * from employee limit 0,1000; //query 1
select * from employee limit 1000,2000; //query 2
select * from employee limit 2000,3000; //query 3
… and so on.
这些查询如何在内部执行(不同或一个)。
附加问题: 与使用 JDBC 逐一检索相比,性能如何(参见此 question )
最佳答案
我认为您想要弄清楚的是如何批量扫描一个非常大的表的所有行。限制可能不是最好的方法。我建议使用索引来过滤行;理想情况下,这将是主键。假设你有一个整数主键;你会做类似的事情:
select * from employee limit 1000; // query 1
// in your client, record the max. primarry key value in the batch, call that "maxid"
select * from employee where id > maxid limit 1000; // query 2
// again, record the maxid (id of the last row) and repeat until no rows are returned
这通常会表现最好。在某些情况下,数据库可能能够优化限制来执行相同类型的操作,但我发现它通常不能。 YMMV 并且您应该确定性能,但是无论数据库查询优化器有多么奇怪,我在这里提倡的方法几乎都可以保证工作。
关于java - MySQL limit子句是如何实现的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20499859/