2012-05-09 3 views
1

Я построил сайт, в котором есть около 1 000 000 продуктов. Я хочу создать набор карт сайта, которые будут содержать ссылки на все продукты. Я понимаю, что карты сайта могут содержать до 50 000 ссылок, поэтому мой план состоит в том, чтобы построить 20 таких карт сайта.Последовательная работа через таблицу MYSQL с 1 000 000 записей?

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

SELECT name, category, catalog_number FROM product ORDER BY id LIMIT 0, 1000 
SELECT name, category, catalog_number FROM product ORDER BY id LIMIT 1000, 1000 
SELECT name, category, catalog_number FROM product ORDER BY id LIMIT 2000, 1000 
SELECT name, category, catalog_number FROM product ORDER BY id LIMIT 3000, 1000 

И так далее.

Проблема заключается в том, что, поскольку первый аргумент LIMIT (смещение) растет, количество времени, которое каждый sql принимает для выполнения, растет очень быстро! Чтобы быть конкретным, когда первый аргумент для LIMIT был чем-то меньшим, чем 28000, оператор выполнил менее 0,3 секунды. Но когда я пробовал:

SELECT name, category, catalog_number FROM product ORDER BY id LIMIT 29000, 1000 

Время, затраченное на выполнение заявления, подскочило до 30 секунд! И каждое утверждение после этого занимало столько же времени, сколько нужно.

Еще одна вещь, которую я пробовал, - это увеличить второй аргумент для LIMIT - но та же проблема возникла.

Любая помощь будет приветствоваться. Спасибо.

+0

Рассмотрите возможность генерации файлов Sitemap из ваших запросов вместо того, чтобы создавать динамические карты. –

+0

Именно так я справился с этим. :) – oyvey

ответ

4

Использование LIMIT требует, чтобы MySQL извлекал все строки до предела, но отбрасывал те, в которых вы не заинтересованы, - а именно, не возвращает их клиенту. Поэтому, если есть тысячи строк для извлечения (и сброса), это может значительно ухудшить время выполнения.

Вместо этого просто отслеживайте последние id, которые вы видели; то всегда фильтр на что:

SELECT name, category, catalog_number 
FROM  product 
WHERE id >= ? -- the last one you saw, or 0/omit if none 
ORDER BY id 
LIMIT 1000 

Это будет особенно быстро, если есть индекс на id колонке.

+0

Groovy! Задача решена. Одно предостережение: мне пришлось изменить свой выбор, чтобы он также выбрал поле id. :) – oyvey

Смежные вопросы