Существует целый ряд факторов, влияющих на производительность, включая серверное оборудование, среднюю нагрузку, настройки MySQL, использование памяти и т. Д. Я собираюсь слепо предположить, что у вас узкое место ввода-вывода и что MySQL правильно настроен для нагрузки, которую вы на него ставите.
Давайте используем подготовленный оператор и транзакцию.В этом примере я буду использовать PDO , но вы можете использовать mysqli , если хотите.Просто прекратите использовать старое и отключенное расширение mysql.
$pdo->beginTransaction();
$statement = $pdo->prepare('
INSERT INTO checklistTest
VALUES(?, NULL, ?, ?, ?, ?, ?, ?, ?, NULL)
');
foreach($this->records as $inc => $record){
foreach($this->records[$inc]["Elements"] as $elementID => $element){
foreach($element as $key => $val) {
$statement->execute(array(
$inc,
$elementID,
$val['name'],
$val['code'],
$val['expected'],
$val['actual'],
$val['match'],
$val['QAResult']
));
}
}
}
$pdo->commit();
Итак, что здесь происходит?Сначала мы начинаем транзакцию .Мы сообщаем базе данных, что собираемся выполнить кучу работы, и мы либо хотим, чтобы все было сделано, либо ничего не сделали.
Во-вторых, мы готовим оператор SQL.Видите эти знаки вопроса?Они называются заполнителями.Позже мы сообщим базе данных заполнить конкретные данные для каждого заполнителя.Также обратите внимание, что нет кавычек.Они в основном добавляются автоматически при заполнении заполнителей.
Внутри цикла мы говорим о выполнении инструкции, и мы используем PDO execute
метод для передачимассив значений для заполнителей.Некоторые люди предпочитают делать эту одну переменную за раз, используя bindParam
, но я предпочитаю метод массива.
Подготовленные операторы, повторенные в цикле , могут быть быстрее, чем неподготовленныеоператоры, хотя разница не будет заметна, если вы не выполните десятки тысяч запросов, что звучит так же, как и вы.
Наконец, когда цикл закончен, мы сообщаем базе данных:совершить работу, которую мы только что сделали.Как я уже упоминал в комментариях, именно здесь возможно значительное повышение производительности.База данных будет фактически постоянно записывать изменения на диск при выполнении фиксации.Это означает, что обычные задачи бухгалтерского учета могут ждать, пока не произойдет фиксация, вместо того, чтобы выполнять их при каждой вставке.Таким образом, большая часть ввода-вывода, которая вам нужна, не должна происходить вживую, когда вы запускаете вставку.
Есть еще одно изменение, которое вам нужно будет сделать, если вы будете использовать эту технику.В течение многих лет MySQL был настроен на , а не для создания безопасных транзакций таблиц по умолчанию.Это означает, что нам нужно немного изменить ваш оператор CREATE TABLE
:
CREATE TABLE checklistTest (
... // No changes inside
) ENGINE=InnoDB
Единственное отличие - в конце, после закрытой пары.Мы просим MySQL использовать механизм хранения InnoDB вместо того, чтобы использовать сервер по умолчанию.Это гарантирует, что мы получим таблицу, которая поддерживает транзакции.
Теперь я понимаю, что просить вас изменить адаптеры базы данных может быть немного глупо, но это не без причины.Хотя вы можете выполнять транзакции с использованием интерфейса oldschool mysql (самостоятельно вводя команды START TRANSACTION
и COMMIT
/ ROLLBACK
), вы не можете использовать с ним подготовленные операторы.Хотя это само по себе не является нарушителем правил, процесс prepare-bind-execute - это процесс, за которым следует каждый современный адаптер базы данных PHP .Старый интерфейс mysql - это , а не современный адаптер базы данных PHP, и вам действительно следует серьезно подумать о переходе на PDO или mysqli.
Еще один фактор производительности - это то, как высобрать данные, которые вы собираетесь написать.Хотя в этом ответе основное внимание уделяется обеспечению того, чтобы сама база данных была настолько узким узким местом, насколько это практически возможно, может оказаться, что ваша проблема с производительностью возникла раньше .Можете ли вы сказать нам, откуда эти данные и как вы их строите? Вы должны серьезно рассмотреть вопрос о профилировании вашего кода , что выявит проблему производительности real .Может случиться так, что биты базы данных уже молниеносны, и проблема полностью в другом.