mysql — обработка больших данных в переполнении стека

Я пытаюсь вставить большие данные в БД после поиска mls свойства (PHRETS)
, Объект результата содержит от 4500 до 5000 записей, каждая из которых имеет 450-475 ключей,
он выдает «HTTP Error 500 Internal server error» при вставке данных в БД через некоторое время (обычно через 6-7 минут) из-за ограничения времени на сервере. Я думаю, я попросил серверных ребят увеличить лимит времени для выполнения, но все равно выдает ошибку

вот процесс моего исполнения

1) Я делаю поиск в MLS для свойств

2) Я пытаюсь вставить все записи одновременно, используя Implode, чтобы сэкономить время выполнения

$qry=mysqli_query($link,"INSERT INTO `rets_property_res` VALUES implode(',', $sql)");

-пытался использовать подготовленные заявления

можем ли мы сохранить эти данные где-нибудь, а затем обработать их сразу ИЛИ можем ли мы ускорить процесс, чтобы все работало в заданные сроки?

0

Решение

Самый быстрый способ сделать это — захватить большой кусок (много тысяч строк), передать его в CSV и выполнить НАГРУЗКА ДАННЫХ ИНФИЛЬ. В некоторых средах отсутствует возможность использовать INFILE LOAD DATA LOCAL …. LOCAL часть из-за настроек сервера. Ссылка выше имеет еще один этот что говорится:

При загрузке таблицы из текстового файла используйте LOAD DATA INFILE. Это
обычно в 20 раз быстрее, чем использование операторов INSERT. Смотрите раздел
14.2.6, «Синтаксис INFILE НАГРУЗКИ ДАННЫХ».

Я обнаружил, что это легко правда.

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

insert myTable (col1,col2) values ('a1','b1'), ('a2','b2'), ('a3','b3');

Таким образом, в приведенном выше примере 3 строки вставляются с одним оператором. Обычно для скорости лучше всего поиграть с 500 до 1000 строк за раз (не 3). Это все зависит от размера строки, в зависимости от вашей схемы, для этого оператора вставки.

Проблемы безопасности: вам нужно быть готовым к возможности атак с использованием инъекций sql 2-го уровня, насколько это возможно. Но это возможно.

Все вышеперечисленное может показаться тривиальным, но для неэкзотического примера и комментария боли в UX я предлагаю следующее. У меня есть приложение на C #, которое собирает вопросы из Stackoverflow и хранит их метрики. Не часть тела или ответы, а заголовок и множество подсчетов и дат. Я вставляю 1000 вопросов за раз в свою базу данных (или делаю insert ignore или insert on duplicate key update). Прежде чем преобразовать это в LOAD DATA INFILE для привязки c # / mysql с повторно используемым подготовленным оператором потребуется около 50 секунд на 1000 После преобразования в LOAD DATA INFILE (включая усечение рабочей таблицы, запись csv и оператор вставки), это занимает около 1,5 секунд на 1000 строк.

1

Другие решения

Как правило, вы не сможете вставить 5000 строк одновременно из-за максимальный размер пакета MySQL (зависит от того, сколько данных есть в каждой вставке).

Попробуйте вставить их в меньшие группы, например, 100 сразу или меньше.

0

По вопросам рекламы [email protected]