mysql ORDER BY не использует индекс, когда в SELECT присутствует несколько полей - PullRequest
2 голосов
/ 21 февраля 2012

Я пытаюсь упростить запрос, чтобы выяснить, почему он так медленно работает на рабочем сервере. Идея состоит в том, чтобы взять X самых последних записей для нумерации страниц. Проблема в том, что оптимизатор MySQL, похоже, хочет использовать сортировку файлов вместо первичного ключа (ID). Удаляя все посторонние вещи, следующие операции работают по желанию, используя индекс (основной):

EXPLAIN SELECT ID FROM table ORDER BY ID DESC

Однако эти варианты относятся к сортировке файлов:

EXPLAIN SELECT ID, field2 FROM table ORDER BY ID DESC
EXPLAIN SELECT * FROM table ORDER BY ID DESC

Мне нужно вернуть несколько полей, чтобы это не работало ... Я могу обойти проблему в упрощенном запросе с помощью:

EXPLAIN SELECT * FROM table FORCE INDEX (Primary) ORDER BY ID DESC

но я не понял, как преобразовать это в более крупный запрос с объединениями таблиц. Я что-то упускаю очень просто?

Ответы [ 2 ]

0 голосов
/ 21 февраля 2012

Проблема решена!Я прошел многочисленные ревизии и не могу поклясться, какая из них была ключевой, но я думаю, что главное было запустить OPTIMIZE TABLE, которая имела следующий эффект очистки:

Type        Usage
Data        241.2 KiB -> 239.4
Index       31,744 B  -> 26,624
Overhead    136 B     -> 0
Effective   272.0 KiB
Total       272.2 KiB -> 265.4

С этим я смогзапустить «EXPLAIN SELECT ID, field2 ИЗ таблицы ORDER BY ID DESC LIMIT 0,10», не прибегая к сортировке файлов, так что это было хорошее начало.После этого я снова начал создавать основной запрос и столкнулся с проблемами, связанными с DISTINCT (ID), не позволяющим использовать первичный ключ в качестве индекса.Однако он должен был быть там, потому что в одной из таблиц, к которым присоединяется поле идентификатора, есть несколько записей для каждого идентификатора.Однако замена DISTINCT (ID) на GROUP BY ID сделала свое дело.Это не сработало ранее, поэтому мне интересно, было ли это как-то связано с OPTIMIZE TABLE?В любом случае, спасибо за попытку помощи, пока я к ней подключился!

0 голосов
/ 21 февраля 2012

Попробуйте этот запрос

select * from table order by id desc limit (pageNO-1) * noEntries , noEntries

например, для страницы 1 и 10 записей на странице

 select * from table order by id desc limit 0, 10

например, для страницы 2 и 10 записей на странице

select * from table order by id desc limit 10, 10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...