2010-12-03 4 views
0

я до сих пор следующие проблемыпорядок по причинам FileSort

EXPLAIN EXTENDED SELECT 
    `item`.`id`, 
    `item`.`timestamp`, 
    `item`.`label` 
    FROM 
    item 
WHERE 
    item.dataTypeId=30 
GROUP BY 
    item.id 
ORDER BY 
    item.timestamp DESC 
LIMIT 0,6; 

Id & метка является первичным ключом пара (MEDIUMINT + DateTime) dataTypeId является внешним ключом (MEDIUMINT) таблица создается как InnoDb

Может быть больше записей с одинаковым идентификатором и другой временной меткой (версии одного и того же элемента). Это аргумент для группы по.

Я прочитал, например, это один: similar topic on stackoverflow

но оно не решить мою проблему.

Я пытался создать следующие показатели:

  1. индекс (dataTypeId, идентификатор метки времени) - в таком порядке
  2. индекс (dataTypeId, метки времени) - в этом порядке индекса
  3. по идентификатору
  4. индекс метки времени

последние два это маленький кусочек отчаяния

Я думаю, я должен пропустить что-то основное -
, но на самом деле не знаю, что.
Не ожидайте, что решение (было бы неплохо :) просто удар мне правильный путь :)

sort_buffer_size теперь 4194288

редактировать: не объясняют - не индексирует

"1" "SIMPLE" "item" "ref" "FK_dataTypeId" "FK_dataTypeId" "4" "const" "5608" "Using where; Using temporary; Using filesort" 

сгенерированные индексы

"1" "SIMPLE" "item" "ref" "FK_udssDataItem_1,testIndexType,testIndexTypeTimestamp,testIndexTypeIdTime" "FK_udssDataItem_1" "4" "const" "5632" "Using where; Using temporary; Using filesort" 
+1

Сортировка файлов не означает, что вы выбрали ** результат запроса EXPLAIN ** – ajreal 2010-12-03 14:03:22

+0

запрос по строке 5000 занимает 2 секунды, я упростил свой первоначальный запрос до минимального размера - и попробовал шаг за шагом, кроме одного возможный причина после другой. Единственная «горячая точка» в EXPLAIN - это «файловая система». Другие строки работают через индексы с небольшим количеством строк ... – jakub 2010-12-03 15:11:08

+0

Во-первых, вы GROUPing по id, но вы заказываете по timestamp ... это не логично. Вероятно, вам нужно упорядочить с помощью некоторой совокупной функции (AVG/MAX/MIN) на отметке времени. – Riedsio 2010-12-03 15:15:46

ответ

1

Возникла проблема с вашим запросом. Когда вы выполняете «группу по id», у вас могут быть разные временные метки для одного и того же идентификатора и не указывать, какой из них использовать (Min(), max() и т. Д.), Аналогичная проблема возникает с полем «label».

http://dev.mysql.com/tech-resources/articles/debunking-group-by-myths.html

Так что вам нужно agregate функции на временной метки и маркировать иначе возвращаемые значения могут быть непредсказуемыми.

Как вы группируете по id и сортировку по метке времени, поэтому MySQL извлекает одну метку времени для каждой группы, поэтому индекс не очень помогает. Вы можете не избавиться от filesort с этим запросом.

1

Так что ваш Вопрос: «Как избежать fileort по вашему запросу»?
В этом случае, чтобы заставить MySQL выполнять сортировку индекса, вам нужно иметь все столбцы в вашем индексе в разделе where.

С ид, метка времени первичного ключа вы должны

where id = myid and item.timestamp between (t1,t2) 

Также остерегайтесь открытых диапазонов (и метки времени < сейчас())

Я не уверен, что datatypeID есть, но если это ваше единственное условие, то добавление индекса только для этого столбца также должно предлагать сортировку индекса. но вам может понадобиться создать индекс (timestamp, datatypeID) ... в этом порядке ... вместо этого.