сгруппировать и отсортировать по времени - PullRequest
0 голосов
/ 04 мая 2019

Запрос занимает более 6 секунд для 4 миллионов записей. Любая другая процедура может быть выполнена, чтобы минимизировать время запроса.

SELECT title_id, count(title_id) as count
FROM `title_keywords`
WHERE keyword_id in (1,2,3,4,5,6,7,8,9) 
GROUP BY title_id 
ORDER BY count desc

Индекс и уникальные столбцы

See the index of table on picture

Добавлен также составной индекс added composite index

Ответы [ 3 ]

1 голос
/ 04 мая 2019

Поскольку функция COUNT должна потенциально касаться каждой записи в каждой группе, может не так много, что может ускорить агрегацию.Однако мы могли бы воспользоваться индексом для ускорения предложения WHERE:

CREATE INDEX idx ON title_keywords (keyword_id, title_id);

Вы также можете попробовать изменить порядок столбцов индекса, и в любом случае, возможно, проверить выполнениеплан с использованием EXPLAIN.Причина, по которой этот индекс может работать, состоит в том, что он позволяет MySQL быстро получать доступ к соответствующим keyword_id записям.Индекс также охватывает title_id, так что это значение будет доступно в конечных узлах B-дерева.

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

Вы пробовали BETWEEN?

WHERE keyword_id BETWEEN 1 AND 9 
GROUP BY title_id 
ORDER BY count DESC
0 голосов
/ 04 мая 2019

попробуйте избежать предложения IN, используя INNER JOIN

SELECT title_id, count(title_id) as count 
FROM title_keywords 
INNER JOIN (
  SELECT 1 col1
  UNION 
  SELECT 2
  UNION 
  SELECT 3
  UNION 
  SELECT 4
  UNION 
  SELECT 5
  UNION 
  SELECT 6
  UNION 
  SELECT 7
  UNION 
  SELECT 8
  UNION 
  SELECT 9    
) t t.col1 = title_keywords.keyword_id  

group by title_id 
order by count desc

и убедитесь, что у вас есть правильный индекс на

столбцы таблицы title_keywords (ключевое слово_id, название_идентификатора)

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