медленный запрос с использованием AVG в MySQL - PullRequest
1 голос
/ 14 декабря 2011

У меня есть эта таблица:

 CREATE TABLE `table1` (
  `object` varchar(255) NOT NULL,
  `score` decimal(10,3) NOT NULL,
  `timestamp` datetime NOT NULL
  KEY `ex` (`object`,`score`,`timestamp`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

с 9,1 миллионами строк, и я выполняю следующий запрос:

SELECT `object`, `timestamp`, AVG(score) as avgs
  from `table1`
 where timestamp >= '2011-12-14'
   AND timestamp <= '2011-12-13'
 group by `object`
 order by `avgs` ASC limit 100;

Даты получены из пользовательского ввода.Запрос занимает 6-10 секунд, в зависимости от диапазона дат.Кажется, время выполнения увеличивается с числом строк

Что я могу сделать, чтобы улучшить это?

Я пытался:

  • возиться с индексами (принес запросвремя ожидания от максимального значения 13 с до максимального значения 10 с)
  • перемещение хранилища в быстрое SAN (время запроса сократилось примерно на 0,1 с независимо от параметров).

Загрузка процессора и памяти включенасервер не выглядит слишком высоким во время выполнения запроса.

1 Ответ

3 голосов
/ 14 декабря 2011

Причина, по которой быстрый SAN работает намного лучше
потому что ваш запрос требует копирования во временную таблицу,
и нужна сортировка файлов для большого набора результатов.

У вас есть пять неприятных факторов.

  • запрос диапазона
  • группа от
  • сортировка
  • varchar 255 для объекта
  • неверный индекс

Метка времени разделения на два поля,

date, time

Создайте еще одну справочную таблицу для объекта,
Итак, вы используете целое число, например, object_id (вместо varchar 255) для представления объекта

Перестроить индекс на

date (date type), object_id

Измените запрос на

where date IN('2011-12-13', '2011-12-14', ...)
...