Подсчет записей большой таблицы на основе формата даты - PullRequest
1 голос
/ 23 июня 2011

Для справки, это моя текущая таблица:

`impression` (
  `impressionid` bigint(19) unsigned NOT NULL AUTO_INCREMENT,
  `creationdate` datetime NOT NULL,
  `ip` int(4) unsigned DEFAULT NULL,
  `canvas2d` tinyint(1) DEFAULT '0',
  `canvas3d` tinyint(1) DEFAULT '0',
  `websockets` tinyint(1) DEFAULT '0',
  `useragentid` int(10) unsigned NOT NULL,
  PRIMARY KEY (`impressionid`),
  UNIQUE KEY `impressionsid_UNIQUE` (`impressionid`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=447267 ;

В нем ведется запись всех показов на определенной странице. После одного дня пробежки он собрал 447266 просмотров. Это много записей.

Теперь я хочу количество посетителей в минуту. Я могу легко получить их так:

SELECT COUNT( impressionid ) AS visits, DATE_FORMAT( creationdate,  '%m-%d %H%i' ) AS DATE
FROM  `impression` 
GROUP BY DATE

Этот запрос, конечно, занимает много времени. Прямо сейчас около 56 секунд.

Так что мне интересно, что делать дальше. Должен ли я:

  • Создание индекса на дату создания (я не знаю, поможет ли это, так как я использую функцию для изменения этих данных, по которой они группируются)

  • Создание новых полей, в которых хранятся часы и минуты отдельно.

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

Или я должен пойти по-другому?

1 Ответ

2 голосов
/ 23 июня 2011

Если вы часто запускаете этот запрос, вы можете денормализовать вычисленное значение в отдельный столбец (возможно, с помощью триггера при вставке / обновлении), а затем сгруппировать по нему.Часы и минуты также хороши, поскольку позволяют группировать несколько разных способов, кроме минут.Это все еще денормализация, но она более универсальна.

Денормализация в порядке, если она оправдана и понятна.

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