1 Вопрос: ActiveRecord ускоряет запрос `where.not`

вопрос создан в Wed, May 8, 2019 12:00 AM

У меня есть запрос, который значительно замедляется при добавлении в запрос предложения 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 символьных строк чисел

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

    
0
  1. Как определить, какие идентификаторы следует включить в массив? Они всегда одинаковы или это будет зависеть?
    2019-05-08 16: 12: 00Z
  2. @ CarlosAlvesJorge всегда отличается. в итоге сравнил идентификаторы в ruby, и это намного быстрее
    2019-05-08 18: 29: 30Z
1 ответ                              1                         

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

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

    
0
2019-05-08 16: 17: 47Z
  1. Также стоит убедиться, что эти идентификаторы установлены в качестве первичных ключей или дополнены индексом UNIQUE.
    2019-05-08 16: 21: 23Z
  2. спасибо. в итоге сравнил идентификаторы в ruby, и это намного быстрее
    2019-05-08 18: 29: 14Z
источник размещен Вот