#mysql
#mysql
Вопрос:
У меня есть простая таблица для комментариев к сообщению, в которой хранятся user_id и post_id. Таким образом, каждый пользователь может оставлять несколько комментариев для каждого сообщения. Вот упрощенный пример создания таблицы:
CREATE TABLE `post_comments` (
`post_id` varchar(64) DEFAULT NULL,
`user_id` varchar(32) DEFAULT NULL,
KEY `post_id` (`post_id`),
KEY `user_id` (`user_id`),
KEY `user_id_and_post_id` (`user_id`,`post_id`),
KEY `post_id_and_user_id` (`post_id`,`user_id`),
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_bin;
Хорошо, теперь я могу получить количество сообщений, в которых конкретный пользователь прокомментировал следующим образом:
SELECT count(DISTINCT post_id) FROM post_comments WHERE user_id='24394249647'
и это работает быстро с моими 12-миллионными записями. Теперь я хочу получить 100 лучших комментаторов, поэтому я хочу подсчитать уникальные сообщения для каждого пользователя:
SELECT user_id, COUNT(DISTINCT post_id) as counter
FROM post_comments
GROUP BY user_id
HAVING counter > 0 ORDER BY counter DESC LIMIT 100
и это запрос на 20 секунд…. как я могу это улучшить?
Комментарии:
1. Рассмотрите возможность хранения идентификаторов в виде целых чисел. Это не сильно поможет, но может немного помочь
2. @Strawberry Я перепутал идентификатор пользователя, он поступает из внешнего источника, такого как YouTube, instagram, Facebook auth.
3. @350D: «Я перепутал user_id, он поступает из внешних источников» — тогда есть вероятность коллизий. Вам лучше иметь уникальный внутренний идентификатор и некоторые сопоставления с внешними идентификаторами.