2016-02-12 3 views
0

У меня есть сценарий импорта, который должен импортировать ~ 500 000 записей из старой и моей старой системы в мой новый, но для импорта требуется немного PHP-обработки (для большей проверки на местах, например, для телефона числа, поэтому я не могу использовать MySQL для обработки).Остановить MySQL от пересчета предыдущих строк

Две вещи, в которых я нуждаюсь, - это возможность следить за ходом импорта, а для скрипта PHP не заканчиваться из памяти (поэтому я не могу просто сразу выбрать все строки).

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

Теперь проблема заключается, когда у меня есть:

select `Column` from `table` where `Something`=1 limit 0, 1000; 

Это занимает сказать, 5 секунд. Но так что теперь на следующем цикле у меня есть:

select `Column` from `table` where `Something`=1 limit 1000, 2000; 

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

+0

Что вы подразумеваете под «пересчитывать строки из первого цикла»? btw, если вы хотите захватить следующие 1000 строк, тогда ваш второй запрос должен заканчиваться на 'limit 1000, 1000' – FuzzyTree

+0

Как работает' limit', он должен выяснить, какие строки ему предшествовали, и поэтому он в основном перевыбирает все строки перед началом 'limit', поэтому он технически строит 2000 строк во второй раз, но я получаю только последние 1000 –

+1

. Если в столбце' Something' есть индекс, он может ускорить обработать. – Mat

ответ

0

Я бы предложил добавить пункт ORDER BY xxx с индексом на столбцах (Something, xxx).

A LIMIT без ORDER BY действительно не имеет значения здесь, поскольку у вас не будет контроля над тем, какие строки появятся в каждом наборе.

+0

Порядок, убивший производительность даже первого запроса, и я определенно имею индексы для используемого столбца. Возможно, я нашел решение, которое побудило меня придумать. Что-то не так с установкой нового столбца «Index» от 1 до и с использованием 'where \' Index \ '> 1000 и \' Index \ '<= 2000' вместо? –

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