Как я могу оптимизировать 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 при использовании пакетной функции загрузчика данных.

0 ответов

Другие вопросы по тегам