Выполнить несколько вставок, обновлений, запросов, разделенных ";" однажды! - PullRequest
2 голосов
/ 27 октября 2010

Я использую удаленный сервер для хранения значений в базе данных MySQL.

Я не использую запросы SELECT, только INSERT, DELETE и UPDATE.

Когда я выполняю 70000 запросов, у меня проблемы со скоростью.

Я пытался mysql_unbuffered_query и видел небольшую прибыль от производительности, но она все еще слишком медленная.

Я помню, что некоторые функции в PHP позволяют мне выполнять несколько строк, разделенных ;

$something=<<<something

query1 ;
query2 ;
query3 ;

something;

execute($something)

Может ли кто-нибудь помочь мне вспомнить?

Может быть, в PDO?

Ответы [ 6 ]

3 голосов
/ 27 октября 2010

Обсуждаемая вами функция - это синтаксис PHP heredoc . Это позволяет вам делать несколько строк строк, используя <<<.

Но PDO не поддерживает несколько операторов SQL одновременно. Вам нужно разделить их и выполнить каждый в отдельности. Вы сказали, что это слишком медленно для вас, поэтому вы не сможете использовать PDO.

Если у вас много утверждений, которые одинаковы, но имеют разные параметры, вы можете использовать подготовленные операторы PDO. С их помощью вы можете подготовить оператор один раз, а затем просто выполнить его с другими параметрами. Если у вас есть несколько типов утверждений, вам нужно будет подготовить каждое из них в отдельности. Подробнее о подготовленных высказываниях вы можете прочитать здесь . У них также есть то преимущество, что они не уязвимы для SQL-инъекций.

2 голосов
/ 27 октября 2010

Вам нужно mysqli.multi-query .Просто создайте SQL-команду (например, как вы делали с этим синтаксисом heredoc) и выполните ее.Убедитесь, что разделитель настроен правильно.

0 голосов
/ 14 мая 2018

Возможно, лучше выполнять массовые операции и заключать их в транзакции (в зависимости от сценария) ...

Для вставок: Как сделать пакетную вставку в MySQL

Для обновлений: https://dba.stackexchange.com/questions/119621/how-to-update-10-million-rows-in-mysql-single-table-as-fast-as-possible

Для удалений: Удаление миллионов строк в MySQL

0 голосов
/ 30 октября 2010

Почему бы вам не назвать сразу все операторы, разделенные точкой с запятой?

mysql_query("
    INSERT INTO something (some, thing) VALUES (123, 456);
    UPDATE AT something STATEMENTS;
    THIRD QUERY; 
    FOURTH MYSQL QUERY; 
    AND SO ON;
");
0 голосов
/ 28 октября 2010

Если вы отправили код из некоторых ваших более медленных запросов, возможно, мы сможем помочь с их настройкой.Часто вы что-то упускаете только потому, что так долго просматривали код.

0 голосов
/ 28 октября 2010

Если вы не хотите ждать, INSERT DELAYED и двоюродные братья с по-прежнему отдельными запросами, путь. Если вы не можете их использовать (например, вы используете механизм хранения InnoDB), вам придется передать их другому процессу, который может / может их ожидать.

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

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