ActiveRecord ускоряет запрос `where.not` - PullRequest
0 голосов
/ 08 мая 2019

У меня есть запрос, который значительно замедляется при добавлении в запрос предложения not.

# query is 13.6ms
FbGroupApplication.select(
:fb_id
).group(:fb_id
).having('count(fb_id) <= 6'
)


# 3,468ms with `where.not` clause. the array is large (5-10k)
FbGroupApplication.where.not(
fb_id: ids
).select(:fb_id
).group(:fb_id
).having('count(fb_id) <= 6'
)

Я добавил индекс на fb_id.Однако следует отметить, что это текстовое поле, а значения состоят примерно из 12 строк символов

Как я могу ускорить этот запрос?

1 Ответ

0 голосов
/ 08 мая 2019

Предполагая, что идентификаторы являются переменными, и из-за их большого количества, я думаю, ваш лучший подход - создать временную таблицу и вставить туда идентификаторы, которые вы хотите исключить.

Затем выполните запрос, используя LEFT JOIN, ВЫБЕРИТЕ идентификаторы, которые не существуют во временной таблице, и УДАЛИТЕ таблицу впоследствии

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...