Лучшие практики PHP / MySQL и Doctrine для мульти-вставки - PullRequest
2 голосов
/ 30 июня 2011

StackOverflow отвечал на многие вопросы раньше, но я ищу более конкретный вопрос, на который я не смог найти точного ответа.

В настоящее время я использую PHP / MySQL с Doctrine 1.2.2с нетерпением жду улучшения моего сценария.Это фактически добавляет около 300 записей каждые 5 минут в базу данных.На самом деле этот скрипт использует многослойную вставку mysql, а не доктрину.

Мне было интересно, что лучше, быстрее и использует меньше ресурсов.Заранее спасибо.

Первое редактирование и тестирование

Хорошо, ребята, прежде всего:)

Сначала я попытался использовать только оператор MySQL.Фабрицио предложил использовать INSERT DELAYED, но он недоступен, так как я использую innoDB.

Я реализовал некоторые тесты, использующие оператор MySQL, запускаемый три раза при каждом задании, которое мне нужно выполнить.Для первого задания я получил в среднем 53 секунды на запуск, используя 6,25 Мб (помните, что я загружаю здесь 138 страниц)

Для второго задания я получил в среднем 3 минуты и 30 секунд, используя 4,25 Мб(помните, что я загружаю 510 страниц здесь)

Для третьей работы я получил в среднем 3 минуты и 9 секунд, используя 4,75 Мб (помните, что я загружаю 410 страниц здесь)

ПервыйРаботу я смог преобразовать в Doctrine, запустив примерно в то же время (53 секунды), но используя 9,75 Мб.На втором и третьем заданиях у меня возникла проблема, поскольку Doctrine не поддерживает ON DUPLICATE KEY, а использование replace () заставляет меня потерять добавленные ранее данные из-за внешнего ключа, а replace () фактически удаляет старое значение и добавляет новое..

Из этих тестов я все равно буду использовать множественную вставку MySQL-запросов.Любой режим идеи для тестирования?

Спасибо вам всем:)

Ответы [ 3 ]

0 голосов
/ 30 июня 2011

Почему бы вам не проверить себя?

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

Для использования памяти вы можете попробовать использовать memory_get_usage.

0 голосов
/ 30 июня 2011
Самостоятельное сравнение

является окончательным решением, но имейте в виду, что чем больше трафика между PHP и MySQL, тем больше времени вы тратите на выполнение запроса.

Я бы предложил расширенную вставку, что-то в строкеиз

INSERT DELAYED INTO `myTable` (field1, field2) VALUES ('val1','val2),('val11','val22')

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

Может быть, вы хотите взглянуть и наbulk_insert_buffer_size, если оно имеет слишком маленькое значение, это может замедлить вставку.

Опять же, вам, вероятно, потребуется выполнить некоторое самотестирование на этом

0 голосов
/ 30 июня 2011

Лучший способ сделать это - использовать пакетную обработку MySQL. Вы можете сделать это двумя способами:

1) Создать длинную строку mysql со всеми вставками в одну строку. Подробнее здесь вставка нескольких строк через массив php в mysql

2) Используйте подготовленные операторы, чтобы создать подготовленный оператор вставки и выполнить один и тот же оператор с разными параметрами. http://php.net/manual/en/mysqli.prepare.php

...