Как я могу оптимизировать N+1 вопрос запроса, когда инструкция SQL содержит orderBy, limit и first?
Я использую knex.js
построитель запросов и загрузчик данных.
Вот мой случай, запрос такой:
this.knex
.select()
.from(this.relation)
.where({ organization_id: orgId })
.orderBy('user_id', 'asc')
.limit(1)
.first();
Вот журнал отладки для knex:
{ method: 'first',
options: {},
timeout: false,
cancelOnTimeout: false,
bindings: [ 1, 1 ],
__knexQueryUid: '8e0a3e49-487b-4169-860d-8e74cf766cce',
sql:
'select * from "USER" where "organization_id" = ? order by "user_id" asc limit ?' }
{ method: 'first',
options: {},
timeout: false,
cancelOnTimeout: false,
bindings: [ 3, 1 ],
__knexQueryUid: 'c835a7ab-7571-4d8a-9024-396e8216ed30',
sql:
'select * from "USER" where "organization_id" = ? order by "user_id" asc limit ?' }
{ method: 'first',
options: {},
timeout: false,
cancelOnTimeout: false,
bindings: [ 5, 1 ],
__knexQueryUid: 'b930fda7-ac82-4402-a693-222cc20ba9b2',
sql:
'select * from "USER" where "organization_id" = ? order by "user_id" asc limit ?' }
{ method: 'first',
options: {},
timeout: false,
cancelOnTimeout: false,
bindings: [ 2, 1 ],
__knexQueryUid: '9b96b673-025b-44bc-8990-e4337f8a2e41',
sql:
'select * from "USER" where "organization_id" = ? order by "user_id" asc limit ?' }
{ method: 'first',
options: {},
timeout: false,
cancelOnTimeout: false,
bindings: [ 85, 1 ],
__knexQueryUid: '5d91b40c-95da-4bdf-9f9b-b22077ddc20b',
sql:
'select * from "USER" where "organization_id" = ? order by "user_id" asc limit ?' }
{ method: 'first',
options: {},
timeout: false,
cancelOnTimeout: false,
bindings: [ 4, 1 ],
__knexQueryUid: '90a7bed0-2ad2-483a-95ae-b92c2d974218',
sql:
'select * from "USER" where "organization_id" = ? order by "user_id" asc limit ?' }
{ method: 'first',
options: {},
timeout: false,
cancelOnTimeout: false,
bindings: [ 86, 1 ],
__knexQueryUid: '3f238005-affb-43e5-a2b7-1b85550d42da',
sql:
'select * from "USER" where "organization_id" = ? order by "user_id" asc limit ?' }
Как я могу использовать batch
функция для оптимизации этого запроса?
Я пытаюсь оптимизировать, используя whereIn
Вместо того, чтобы использовать where
const queryBuilder = this.knex(this.relation)
.whereIn('organization_id', orgIds)
.orderBy('user_id', 'asc');
Вот оптимизированный журнал отладки запросов:
{ method: 'select',
options: {},
timeout: false,
cancelOnTimeout: false,
bindings: [ 1, 3, 5, 2, 85, 4, 86 ],
__knexQueryUid: '3511664e-a9f7-414f-9ea3-6410120ba17c',
sql:
'select * from "USER" where "organization_id" in (?, ?, ?, ?, ?, ?, ?) order by "user_id" asc' }
Запрос пакетируется, но запрошенный результат неверен.
Я не знаю как справиться orderBy
, limit(1)
а также first
при использовании пакетной функции загрузчика данных.