gpt4 book ai didi

mysql - 避免在 Jooq 子查询中获取

转载 作者:行者123 更新时间:2023-11-29 05:48:08 26 4
gpt4 key购买 nike

我需要从一个非常大的表中选择“页面”数据。由于 WHERE 子句和需要分页到相当大的偏移量,我使用子查询来获取 ID。此策略仅在我将 fetch 放在末尾时才有效。这导致(我认为)额外的数据库往返。有没有办法避免额外的fetch

final Object subquery =
JooqUtil.DSL_CONTEXT
.select(ID_FIELD)
.from(MY_TABLE)
.where(conditionBuilder.build())
.orderBy(UPDATED_AT.asc())
.offset(offset.get())
.limit(limit.get())
.fetch();

return JooqUtil.toPreparedSql(
JooqUtil.DSL_CONTEXT
.select(JooqUtil.createFields(ALL_COLUMN_NAMES))
.from(MY_TABLE)
.where(ID_FIELD.in(subquery)));

附注我这样做的原因是由于 orderBy/offset/limit for large offsets(我选择的列之一不符合添加到索引的条件,因为它是 blob 类型,所以我无法创建覆盖指数)。

最佳答案

是的,确实可以避免单独的数据库往返。在您的情况下,您应该能够简单地在第一个查询中使用第二个查询的 SELECT 子句:

return JooqUtil.toPreparedSql(
JooqUtil.DSL_CONTEXT
.select(JooqUtil.createFields(ALL_COLUMN_NAMES))
.from(MY_TABLE)
.where(conditionBuilder.build())
.orderBy(UPDATED_AT.asc())
.offset(offset.get())
.limit(limit.get())
);

由于您的行有一个 ID,因此您可能希望使用 jOOQ 的 SEEK 子句而不是 OFFSET。我建议你阅读 this blog postthis manual section其中解释了区别是什么以及您可能想要使用 SEEK 的原因。

关于mysql - 避免在 Jooq 子查询中获取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57501182/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com