У меня есть база данных MySQL и таблица, содержащая около 128 000 строк (довольно мало, насколько я понимаю). У меня также есть приложение, подключенное к нему, которое настроено для пейджинга. Мои SQL-запросы выглядят примерно так:
SELECT * FROM Documents WHERE PortfolioId = ? LIMIT ?,?
SELECT * FROM Documents WHERE PortfolioId = ? ORDER BY Date DESC LIMIT ?,?
Моя проблема двояка. Во-первых, независимо от того, какой запрос используется, чем выше первое число «LIMIT», тем медленнее возвращается запрос, что в конечном итоге приводит к неприемлемой задержке. Например, если я зайду в phpmyadmin и выполню:
SELECT * FROM Documents WHERE PortfolioId = 1 LIMIT 0,20
Запрос занимает 0,001 секунды. Однако, когда я выполняю это:
SELECT * FROM Documents WHERE PortfolioId = 1 LIMIT 120000,20
Запрос занимает 14,8 секунды.
Моя вторая проблема заключается в том, что второй запрос, в котором я упорядочиваю по дате (которая также проиндексирована в таблице), заставляет соответствующие запросы выполняться намного дольше (0,1 секунды для первого примера, 2 минуты и 23 секунды< /em> для второго примера).
Есть ли лучший способ выполнить эти запросы, чтобы они были намного быстрее? Насколько я понимаю, разработчики часто реализуют пейджинг для таблиц с миллионами строк, но при таком подходе загрузка последующих страниц занимает очень много времени.
Documents
и использовать его в последующих запросах. то естьSELECT * FROM Documents WHERE PortfolioId = 1 AND DocumentId > ? LIMIT 20
. Однако обратите внимание, что это даст результаты, отличные от вашего текущего метода, если таблица обновляется между запросами. - person Michael Mior   schedule 15.07.2012WHERE Date >= LAST_DATE AND DocumentId > LAST_ID
должно работать, если вы используетеORDER BY Date, DocumentId
. - person Michael Mior   schedule 15.07.2012