MySQL ORDER BY оптимизация по дальности - PullRequest
1 голос
/ 11 ноября 2009

Я бы хотел, чтобы MySQL использовал индекс для сортировки этих строк.

SELECT
  identity_ID
FROM
  identity
WHERE
  identity_modified > 1257140905
ORDER BY
  identity_modified

Однако для сортировки файлов используется сортировка (нежелательно).

Теперь, если я опущу здесь предложение ORDER BY, строки получатся отсортированными просто в результате использования индекса для удовлетворения предложения WHERE .

Итак, я могу получить желаемое поведение, исключив предложение WHERE, но затем я полагаюсь на то, что поведение MySQL будет последовательным, чтобы строки были расположены по порядку, и в будущем может застрять, если MySQL изменит свое внутреннее поведение.

Что мне делать? Любой способ сказать MySQL, что, поскольку индекс хранится в порядке (b-дерево), ему не нужна файловая сортировка для этого?

Таблица выглядит так (упрощенно):

CREATE TABLE IF NOT EXISTS `identity` (
  `identity_ID`       int(11) NOT NULL auto_increment,
  `identity_modified` int(11) NOT NULL,
  PRIMARY KEY         (`identity_ID`),
  KEY                 `identity_modified` (`identity_modified`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;

Ответы [ 2 ]

0 голосов
/ 12 ноября 2009

Решение, которое я имею до сих пор, состоит в том, чтобы исключить предложение ORDER BY и добавить FORCE INDEX (identity_modified) к запросу. Теоретически это должно гарантировать, что строки возвращаются в том порядке, в котором они хранятся в индексе.

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

0 голосов
/ 11 ноября 2009

Если вы измените тип таблицы на INNODB, файловая сортировка не будет

ALTER TABLE mydb. identity ENGINE = INNODB;

Но я не уверен, что есть проблема с вашим запросом: http://forums.mysql.com/read.php?24,10738,10785#msg-10785

Запустите исходный запрос с помощью EXPLAIN до и после операции.

http://dev.mysql.com/doc/refman/5.0/en/using-explain.html

...