Проблемы с производительностью больших таблиц MySQL при работе с PHP - PullRequest
6 голосов
/ 12 апреля 2009

Имейте огромную таблицу mysql с примерно 300 000 записей и хотите разместить записи в PHP (не в этом дело) с запросом следующим образом:

SELECT * FROM `table` LIMIT 250000, 100 

Это может быть в основном медленным в последней части записей, особенно, когда ближе к концу таблицы (LIMIT начало очень большое). Я предполагаю, что MySQL должен считать до 250000, прежде чем собирать результаты для меня?

Итак, как обойти этот или любой другой подход к подкачке, который может быть намного быстрее? Спасибо!

Ответы [ 4 ]

4 голосов
/ 12 апреля 2009

Убедитесь, что вы используете индекс, иначе он выполняет полное сканирование таблицы. Вы можете посмотреть на план выполнения, чтобы проверить это или вызвать проблему, используя предложение ORDER BY (в индексированном столбце). Вот больше информации .

Ваша таблица не такая большая, 300 000 строк. Однако при приближении к таблице возникают проблемы с производительностью. Единственное реальное решение для этого - подделать предложение limit. Иметь поле автоматического приращения, которое нумерует строки от 1 до 300 000, а затем делает:

SELECT *
FROM mytable
WHERE field BETWEEN 250000 and 250100

или аналогичный. Это может быть проблематичным или невозможным, если вы часто удаляете строки, но я склонен обнаруживать, что более старые данные имеют тенденцию меняться меньше, поэтому вы можете несколько оптимизировать их, используя LIMIT для первых 100 000 строк и столбец суррогатной подкачки за этим. 1010 *

1 голос
/ 12 апреля 2009

Вы правы: MySQL должен сканировать 250000 бесполезных строк, прежде чем читать те, которые вы хотите. На самом деле не существует обходного пути для этого сохранения, если разделить таблицу на несколько или использовать хак, например:

SELECT * FROM table WHERE id BETWEEN 250000 AND 250000 + 100 - 1
;or
SELECT * FROM table WHERE id > 250000 ORDER BY id ASC LIMIT 100

Но это все еще не точно подражает функции оператора LIMIT в сложных запросах. Это скорость: функциональные издержки.

0 голосов
/ 12 апреля 2009

Если у вас есть поле автоинкремента, вы можете просто сделать:

SELECT * FROM table 
WHERE ID > @LastID 
ORDER BY ID
LIMIT 100
0 голосов
/ 12 апреля 2009

Это действительно весь запрос, или у вас также есть предложение ORDER BY? Потому что это сильно замедлит запросы. Должно помочь, если вы можете получить указатель на полный набор товаров, по которым вы заказываете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...