MySQL запрос медленно, когда лимит идет до последних записей - PullRequest
0 голосов
/ 19 октября 2011

У меня есть приложение Java, и я хотел бы получить некоторые данные из таблицы и отобразить в приложении.

У меня есть миллионы записей, и запрос становится очень медленным, когда я иду к последнемузаписей.получение результатов занимает несколько хороших минут.

select Id from Table1x where description like '%error%' and Id between 0 and 1329999 limit 0, 1000

Приведенный выше запрос возвращает быстрый результат.То есть первые страницы быстро возвращаются.Но когда я перемещаю последние страницы, это становится медленным.

select Id from Table1x where description like '%error%' and Id between 0 and 1329999 limit 644000, 1000. 

Этот запрос медленный и занимает 17 секунд.

Есть идеи, как сделать это быстрее?Идентификатор является первичным ключом table1x.

1 Ответ

1 голос
/ 19 октября 2011

Проблема в том, как. Чтобы получить первые 1000 записей, базе данных нужно только отфильтровать базу данных, пока она не найдет 1000 записей, соответствующих поисковому запросу. Для другого запроса база данных должна соответствовать записям, пока у нее не будет 645000 записей, что значительно замедляет работу. Сортировка или другая фильтрация отсутствуют, поэтому индекс по идентификатору не помогает вообще.

Индекс на description может помочь, но если вы начнете поиск с подстановочного знака, как вы делаете сейчас.

Я вижу два решения.

Первый вариант - добавить индекс FULLTEXT в поле описания. Это позволяет искать слово error, используя MATCH, а не LIKE. Я думаю, что это будет намного быстрее, но индекс тоже станет больше, и я не уверен насчет оптимизаций в долгосрочной перспективе.

Второе решение: Поскольку вы, очевидно, ищете ошибки (я думаю, вы создаете отчет на таблице журнала?), Вы можете добавить столбец с типом записи. Вы можете дать каждой записи тип (просто целое число), который указывает, где эта запись содержит ошибку или нет. Вам нужно будет обновить таблицу один раз и вставить тип вместе с новыми записями, но это ускорит ваш запрос.

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

...