Можно ли оптимизировать этот SQL-запрос? - PullRequest
0 голосов
/ 02 августа 2010

All

Я использую это как условие для моего оператора select.

WHERE RecDate >= '%s' GROUP BY DATE(RecDate), HOUR(RecDate), MINUTE(RecDate), 
SECOND(RecDate) - (Second(RecDate) \% %d) LIMIT %d

В настоящее время этот запрос занимает слишком много времени. То, что я пытаюсь сделать здесь, это собрать X количество строк после определенной даты. Я также не хочу каждую строку, я хочу каждую N-ую строку, и это то, чего я достиг для секции GROUP.

В основном у меня есть набор аналоговых сигналов, которые дискретизируются и помещаются в БД с частотой 1 Гц (каждая строка). Я не хочу отображать на графике около 4-8 часов данных за раз, но это Имеет смысл отодвинуть все точки назад.

Я пытаюсь максимально использовать базу данных. Можно ли как-нибудь ускорить выполнение этого запроса?

С уважением, Кен

Вот инструкция create для моей таблицы.

DROP TABLE IF EXISTS `vdaq_6`.`readings`;
CREATE TABLE  `vdaq_6`.`readings` (
  `RigId` varchar(15) NOT NULL DEFAULT '',
  `Location` varchar(45) NOT NULL DEFAULT '',
  `RecDate` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
  `0123` double NOT NULL DEFAULT '0',
  `0124` double NOT NULL DEFAULT '0',
  `0118` double NOT NULL DEFAULT '0',
  `0114` double NOT NULL DEFAULT '0',
  `0126` double NOT NULL DEFAULT '0',
  `0121` double NOT NULL DEFAULT '0',
  `0141` double NOT NULL DEFAULT '0',
  `0137` double NOT NULL DEFAULT '0',
  `1129` double NOT NULL DEFAULT '0',
  `0130` double NOT NULL DEFAULT '0',
  `0108` double NOT NULL DEFAULT '0',
  `0113` double NOT NULL DEFAULT '0',
  `0110` double NOT NULL DEFAULT '0',
  `0116` double NOT NULL DEFAULT '0',
  `0120` double unsigned NOT NULL DEFAULT '0',
  `0112` double NOT NULL DEFAULT '0',
  `0128` double NOT NULL DEFAULT '0',
  `0423` double NOT NULL DEFAULT '0',
  PRIMARY KEY (`RigId`,`Location`,`RecDate`),
  KEY `Index_2` (`RecDate`),
  KEY `replication` (`UpdateCd`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='v2;InnoDB free: 523264 kB';

1 Ответ

0 голосов
/ 02 августа 2010

Группа будет не получать каждую N-ю строку; похоже, он предназначен для суммирования или усреднения каждых N строк (где N предположительно является четным делителем 60).

Если вам действительно нужен каждый N-й ряд, это может быть намного быстрее; замените группу на порядок по RecDate и добавьте where (second (RecDate) \%% d) == 0.

Но, пожалуйста, покажите нам фактические выбранные поля.

...