java - MySQL limit子句是如何实现的

标签 java mysql sql jdbc

我有一个非常大的表来检索记录。我正在使用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/

相关文章:

php - 哪一个更好?使用您自己的加密算法还是使用 md5/sha1?

sql - 高效使用SQL GROUP BY、SUM、COUNT

PHP 代码不通过批处理文件运行

java - 如何引用在另一个文件中声明的类并将其添加为静态字段

java - java中检查文件夹权限的问题

java - 如果数组中有零,如何将数组中的元素向左移动 1?

java - 如何正确读取 Flux<DataBuffer> 并将其转换为单个 inputStream

php - 更新一组用户id

c# - 如何使用 ASP.net 在 SQL 中获取最后插入记录的 ID

sql - 删除重复行(不要删除所有重复行)