3 фев в 14:08 (OFF) JohnDidact (B) :

MySQL, сортировка и индексы

Есть таблица с постами discus, есть таблица с комментариями discus_com, есть таблица с категориями discus_cat. Задача: показать все обсуждения в категории с id 2, 3 и 5, отсортированных по количеству комментариев (или по тому, где оставили крайние комментарии, проще говоря - обсуждаемые). Делал примерно так:

SELECT
discus.id, # id поста
(SELECT COUNT(did) FROM discus_com WHERE did = discus.id AND archived IS NULL) AS com_count, # количество неархивированных (или не скрытого) комментариев для поста
(SELECT MAX(did) FROM discus_com WHERE did = discus.id AND archived IS NULL) AS last_com # id крайнего неархивированного (или не скрытого) комментария для поста
FROM discus
LEFT JOIN discus_cat ON discus_cat.id = discus.dcid
WHERE discus.dcid IN (2,3,5)
ORDER BY com_count DESC
did в discus_com - id поста, к которому принадлежит комментарий,
archived - если NULL, то неархиврованный (не скрытый, не удалёный) комментарий. Если пустая строка, то TRUE (удалён, скрыт...),
dcid - id категории, к которой принадлежит пост.

Понятное дело, происходит файловая сортировка со всеми вытекающими...

Решил в таблицу discus добавить два поля: last_cid - где хранится id крайнего комментария; num_com - количество комментариев. Запрос выглядит примерно так:

SELECT discus.id
FROM discus
WHERE discus.dcid IN (2,3,5)
ORDER BY discus.num_com
На самом деле код выглядит так...

Всё, вроде бы, отлично. Используется индекс 'nd' (состоящий из num_com и dcid) НО! поля num_com и last_cid обновляются при каждом добавлении комментария. А, как известно (или я ошибаюсь?) обновлять, тем более так часто, проиндексированные строки - ни есть хорошо. В общем. Ваши предложения? Как мне сортировать посты по количеству комментариев и последнему добавленному комментарию?

Всем картошки в дом! 😘
28 0 0 0
← Пред. След. →

Комментарии (0)

Показать комментарий
Скрыть комментарий
Для добавления комментариев необходимо авторизоваться
Танки. Стальной легион
Десятки видов техники, тяжелые бои и секретные...
Версия: Mobile | Lite | Touch | Доступно в Google Play