Как эффективно отсортировать результаты подзапроса? - PullRequest
0 голосов
/ 23 октября 2019

Допустим, у меня есть сайт, такой как Stackoverflow, с сообщениями, на которые люди могут отвечать, и я хотел бы иметь интерфейс для сортировки сообщений по количеству ответов

Это в конечном итоге будет иметь бесконечную нумерацию прокрутки, поэтому показ10 результатов за раз.

Вот пример запроса для этого:

SELECT *, (SELECT COUNT(*) 
           FROM post_reply pr 
           WHERE pr.convo_id = post.convo_id) as replies 
FROM post 
ORDER BY replies 
LIMIT 10;

Это работает, но это слишком медленно. У меня есть сотни тысяч сообщений, и это приводит к тому, что выполнение запроса занимает более 30 с.

Индекс улучшит скорость, но я не знаю, как реализовать индекс для подзапроса.

Материализованное представление также может работать, но обновление материализованного представления каждый раз, когда кто-то отвечает на сообщение, также кажется слишком медленным.

Есть ли хорошее решение этой проблемы?

Ответы [ 2 ]

1 голос
/ 23 октября 2019

Вы можете изменить порядок запросов и сначала создать список сообщений по количеству ответов, а затем получить post столбцы. При этом следует использовать первичный ключ (я предполагаю, что post.convo_id - один) и, возможно, будет быстрее, хотя я не гарантирую, что он будет.

SELECT post.*, sub.replies
  FROM (SELECT pr.convo_id, COUNT(*) AS replies
          FROM post_reply pr
         GROUP BY pr.convo_id
         ORDER BY replies --maybe DESC if you want top reply count first
         LIMIT 10
       ) AS sub
  JOIN post USING(convo_id);
1 голос
/ 23 октября 2019

Вы не можете реально ускорить этот запрос.

Вы можете изменить модель данных и использовать большую инфраструктуру для более быстрой сортировки. Идея такова:

  1. Добавить столбец post_reply_count в таблицу posts.
  2. Добавить индекс для этого столбца.
  3. Поддерживать актуальность этого столбца с помощью триггеров - + 1 для insert, - 1 для delete. И все, что подходит для update.
  4. Используйте этот столбец в своем запросе.

Это добавляет накладные расходы. Но если вам действительно нужен быстрый ответ на этот запрос, у вас может не быть выбора.

...