Как оптимизировать запрос, использующий группирование по большому количеству строк - PullRequest
2 голосов
/ 06 октября 2010

Таблица выглядит следующим образом:

    CREATE TABLE `tweet_tweet` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `text` varchar(256) NOT NULL,
      `created_at` datetime NOT NULL,
      `created_date` date NOT NULL,
...
      `positive_sentiment` decimal(5,2) DEFAULT NULL,
      `negative_sentiment` decimal(5,2) DEFAULT NULL,
      `entity_id` int(11) DEFAULT NULL,
      PRIMARY KEY (`id`),
      KEY `tweet_tweet_entity_created` (`entity_id`,`created_at`)
    ) ENGINE=MyISAM AUTO_INCREMENT=1097134 DEFAULT CHARSET=utf8

Объяснение запроса выглядит так:

mysql> explain SELECT `tweet_tweet`.`entity_id`, 
       STDDEV_POP(`tweet_tweet`.`positive_sentiment`) AS `sentiment_stddev`, 
       AVG(`tweet_tweet`.`positive_sentiment`) AS `sentiment_avg`, 
       COUNT(`tweet_tweet`.`id`) AS `tweet_count` 
       FROM `tweet_tweet` 
       WHERE `tweet_tweet`.`created_at` > '2010-10-06 16:24:43'  
       GROUP BY `tweet_tweet`.`entity_id` ORDER BY `tweet_tweet`.`entity_id` ASC;

+----+-------------+-------------+------+---------------+------+---------+------+---------+----------------------------------------------+
| id | select_type | table       | type | possible_keys | key  | key_len | ref  | rows    | Extra                                        |
+----+-------------+-------------+------+---------------+------+---------+------+---------+----------------------------------------------+
|  1 | SIMPLE      | tweet_tweet | ALL  | NULL          | NULL | NULL    | NULL | 1097452 | Using where; Using temporary; Using filesort |
+----+-------------+-------------+------+---------------+------+---------+------+---------+----------------------------------------------+
  1 row in set (0.00 sec)

Каждый день в таблицу добавляется около 300 000 строк.Запрос выполняется около 4 секунд прямо сейчас, но я хочу уменьшить его до 1 секунды, и я боюсь, что запрос будет экспоненциально дольше, поскольку дни идут.Общее количество строк в tweet_tweet в настоящее время составляет чуть более 1 млн., Но оно будет быстро расти.

Есть мысли по оптимизации?Нужны ли еще индексы?Должен ли я использовать что-то вроде Cassandra вместо MySQL?=)

Ответы [ 4 ]

1 голос
/ 06 октября 2010

Вы можете попытаться изменить порядок полей в индексе (т. Е. KEY tweet_tweet_entity_created (created_at, entity_id). Это позволит mysql использовать индекс для уменьшения количества фактических строк, которые необходимо сгруппировать и упорядочить).

0 голосов
/ 13 октября 2010

Если у вас MySQL версии 5.1 или выше, вы можете рассмотреть возможность разделения для больших таблиц.

http://dev.mysql.com/doc/refman/5.1/en/partitioning.html

0 голосов
/ 06 октября 2010

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

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

0 голосов
/ 06 октября 2010

Вы не используете индекс tweet_tweet_entity_created. Измените ваш запрос на:

explain SELECT `tweet_tweet`.`entity_id`, 
       STDDEV_POP(`tweet_tweet`.`positive_sentiment`) AS `sentiment_stddev`, 
       AVG(`tweet_tweet`.`positive_sentiment`) AS `sentiment_avg`, 
       COUNT(`tweet_tweet`.`id`) AS `tweet_count` 
       FROM `tweet_tweet` FORCE INDEX (tweet_tweet_entity_created)
       WHERE `tweet_tweet`.`created_at` > '2010-10-06 16:24:43'  
       GROUP BY `tweet_tweet`.`entity_id` ORDER BY `tweet_tweet`.`entity_id` ASC;

Подробнее о подсказках к указателю можно прочитать в руководстве по MySQL http://dev.mysql.com/doc/refman/5.1/en/index-hints.html

Иногда оптимизатору запросов MySQL требуется небольшая помощь.

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