порядок по причинам сортировка файлов - PullRequest
0 голосов
/ 03 декабря 2010

У меня все еще есть проблема

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 & timestamp - это пара первичных ключей (mediumint + datetime) dataTypeId - это внешний ключ (mediumint) таблица создается как InnoDb

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

Я читал, например, этот: похожая тема по stackoverflow

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

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

  1. индекс включен (dataTypeId, id, timestamp) - в этом порядке
  2. индекс включен (dataTypeId, timestamp) - в этом порядке
  3. индекс по id
  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"

Ответы [ 2 ]

1 голос
/ 03 декабря 2010

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

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

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

1 голос
/ 03 декабря 2010

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

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

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

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

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

...