Чрезвычайно медленный при выполнении нескольких отдельных запросов MySQL

Я заметил проблему с производительностью на одном из моих серверов под управлением Apache/PHP/MySQL.

Поэтому я решил исследовать и протестировать его на других серверах.

Что я сделал?

На трех разных серверах я создал базу данных (db_sandbox), с одной таблицей innodb (table_sandbox), с 4 столбцами (id (int), title (varchar 255), description (text), date (timestamp)). ПРИМЕЧАНИЕ: id - это первичный ключ с автоинкрементом.

Я создал простую подпрограмму PHP, которая включает 15.000 записей в эту таблицу, группами по 5.000, используя 3 различных метода:

  • Метод 1: 5.000 команд вставки, каждая из которых обрабатывается индивидуально через 5000 отдельных запросов
  • Способ 2: 5.000 команд вставки, разделенных точкой с запятой, за один вызов БД.
  • Метод 3: 1 команда вставки из 5000 записей.

Прежде всего, очевидно, что методы 2 и 3 являются лучшими в отношении производительности. Но это не главное. На самом деле, методы 2 и 3 являются просто идеальными сценариями, но встречаются редко.

В любом случае, когда я сравнивал результаты каждого из них, я был удивлен. Рассматривая SERVER-1 в качестве моего проблемного сервера, вот что я получил:

  • Метод 1: SERVER-2 в 165 раз быстрее, а SERVER-3 в 40 раз быстрее;
  • Метод 2: SERVER-2 в 6 раз быстрее, а SERVER-3 в 7 раз быстрее;
  • Метод 3: SERVER-2 работает на 5% медленнее, а SERVER-3 - в 1,5 раза быстрее;

Мой вывод заключается в том, что в настройках SERVER-1 есть что-то, что влияет на выполнение нескольких отдельных запросов.

Кто-нибудь знает, какими могут быть настройки?

SERVER-1: это виртуальная машина

  • Intel Xeon E5-2630 v3 2,4 ГГц
  • 16 ГБ ОЗУ
  • SSD 120 ГБ
  • Windows Server 2012 R2
  • MySQL 5.6
  • VMWare

SERVER-2

  • Intel Xeon X3360 2,83 ГГц
  • 4 ГБ ОЗУ
  • SSD 250 ГБ
  • Windows Server 2003 (готов к выходу на пенсию)
  • MySQL 5.0

SERVER-3

  • Intel I7-3770 3,4 ГГц
  • 16 ГБ ОЗУ
  • SSD 120 ГБ
  • Windows 8.1 Pro
  • MySQL 5.6

ПРИМЕЧАНИЕ. Я сравнил my.ini с SERVER-1 и SERVER-3, и они практически идентичны. SERVER-2, работает Mysql 5.0 очень отличается.

1 ответ

Если я читаю и хорошо понимаю ваш вопрос, вы сравниваете те результаты, которые вы получаете на виртуальной машине Windows, работающей на ESXi, с server2 и 3, на которых их ОС работают на голом железе.

Пока HW остается похожим, нет никаких шансов, что вы увидите лучшую производительность на виртуальной машине.

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

Что замедляет эти вставки на сервере Server1, так это, вероятно, уровень виртуализации, и существует огромное количество литературы, в которой обсуждается, что не следует виртуализировать, когда производительность - это точка.

Кроме того, это особенно верно для ESXi без флеш-кеша.

После многих испытаний и проб разных комбинаций я не могу сказать, что нашел идеальное решение, которое, вероятно, включало бы некоторые настройки виртуальной машины, которые не мог найти мой ИТ-специалист. В любом случае, вот две вещи, которые действительно имеют значение в производительности (имейте в виду, что это относится только к INNODB):

1 - использовать транзакции, т. Е. Отключить автокоммит, выполнить все транзакции и зафиксировать в конце.

2 - Вы можете значительно увеличить производительность, установив innodb-flush-log-at-trx-commit в 0 или 1. Пожалуйста, прочитайте полную документацию, чтобы понять последствия этого действия.

Я надеюсь, что это поможет кому-то еще там.

Другие вопросы по тегам