使用 JOOQ 分页
pagination with JOOQ
我正在尝试使用 JOOQ 对来自 Mysql 数据库的结果进行分页,
我想向我的 MySQL 数据库请求特定偏移量。
我的客户请求具有不同偏移量的不同大小的结果,而我的服务是无状态的。
我不想使用 limit 和 offset,因为我知道它们的性能很差。
public void fetch() {
Cursor<Record> cursor = null;
String query = "books WHERE type = 'KIDS'";
try {
cursor = create.selectFrom(query).fetchLazy();
while (cursor.hasNext()) {
Record book = cursor.fetchNext();
}
}
finally {
if (cursor != null) {
cursor.close();
}
}
}
如何从第 5 页或第 1000 到 1100 本书开始?
此致,
马坦
在性能方面,LIMIT
没有任何问题。 OFFSET
确实会导致性能问题,因为从 OFFSET
跳过的行必须由数据库服务器处理,就像您实际获取它们一样,只是不必传输它们通过电线。
话虽如此,您尝试在 Java 客户端中实施 OFFSET
的方法比在 SQL 中实施它要糟糕得多。您在服务器端做(至少)相同数量的工作,同时将 更多 数据传输到客户端只是为了再次丢弃它。只需使用 OFFSET
,在这种情况下,如果您 必须 分页到第 5 页。
一种更快的分页方法是 keyset pagination, which is supported by jOOQ via the SEEK
clause。这是一种不同类型的分页,不允许很容易地跳转到第 5 页,只能跳转到“下一页”(例如 Twitter 时间线)。
我正在尝试使用 JOOQ 对来自 Mysql 数据库的结果进行分页, 我想向我的 MySQL 数据库请求特定偏移量。
我的客户请求具有不同偏移量的不同大小的结果,而我的服务是无状态的。
我不想使用 limit 和 offset,因为我知道它们的性能很差。
public void fetch() {
Cursor<Record> cursor = null;
String query = "books WHERE type = 'KIDS'";
try {
cursor = create.selectFrom(query).fetchLazy();
while (cursor.hasNext()) {
Record book = cursor.fetchNext();
}
}
finally {
if (cursor != null) {
cursor.close();
}
}
}
如何从第 5 页或第 1000 到 1100 本书开始?
此致, 马坦
在性能方面,LIMIT
没有任何问题。 OFFSET
确实会导致性能问题,因为从 OFFSET
跳过的行必须由数据库服务器处理,就像您实际获取它们一样,只是不必传输它们通过电线。
话虽如此,您尝试在 Java 客户端中实施 OFFSET
的方法比在 SQL 中实施它要糟糕得多。您在服务器端做(至少)相同数量的工作,同时将 更多 数据传输到客户端只是为了再次丢弃它。只需使用 OFFSET
,在这种情况下,如果您 必须 分页到第 5 页。
一种更快的分页方法是 keyset pagination, which is supported by jOOQ via the SEEK
clause。这是一种不同类型的分页,不允许很容易地跳转到第 5 页,只能跳转到“下一页”(例如 Twitter 时间线)。