Ускорить группу активных записей по количеству запросов - PullRequest
1 голос
/ 06 мая 2019

Как я могу ускорить следующий запрос? Я смотрю, чтобы найти запись с 6 или менее уникальными значениями fb_id. Выбор, кажется, не добавляет много времени, но вместо этого это group и count. Есть ли альтернативный способ запроса? Я добавил индекс на fb_id, и он только ускорил запрос на 50%

FbGroupApplication.group(:fb_id).where.not(
  fb_id: _get_exclude_fb_group_ids
).group(
  "count_fb_id desc"
).count(
  "fb_id"
).select{|k, v| v <= 6 }

Запрос ищет FbGroupApplications с 6 или менее приложениями к одному и тому же fb_id

1 Ответ

2 голосов
/ 06 мая 2019

Передача блока в метод select заставила Rails вызвать SQL, преобразовать найденные строки в объект (запись) ruby ​​ActiveRecord :: Base, а затем выполнить выборку на основе массива, который вы дали. Весь этот процесс является дорогостоящим (в этом нет ничего хорошего).

Вы можете "делегировать" ответственность за сравнение счетчика с 6 в базе данных с помощью предложения having:

FbGroupApplication
  .group(:fb_id)
  .where.not(fb_id: _get_exclude_fb_group_ids)
  .having('count(fb_id) <= 6')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...