Я пытаюсь вставить большие данные в БД после поиска 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)");
-пытался использовать подготовленные заявления
можем ли мы сохранить эти данные где-нибудь, а затем обработать их сразу ИЛИ можем ли мы ускорить процесс, чтобы все работало в заданные сроки?
Самый быстрый способ сделать это — захватить большой кусок (много тысяч строк), передать его в 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 строк.
Как правило, вы не сможете вставить 5000 строк одновременно из-за максимальный размер пакета MySQL (зависит от того, сколько данных есть в каждой вставке).
Попробуйте вставить их в меньшие группы, например, 100 сразу или меньше.