Этот вопрос, вероятно, можно задать и в StackOverflow, но сначала я попробую здесь ...
Производительность операторов INSERT и UPDATE в нашей базе данных, похоже, ухудшается и приводит к снижению производительности в нашем веб-приложении.
Таблицы - это InnoDB, и приложение использует транзакции. Есть ли какие-нибудь простые настройки, которые я могу сделать, чтобы ускорить работу?
Я думаю, у нас могут быть проблемы с блокировкой, как я могу узнать?
Убедитесь, что ваше оборудование и ОС правильно настроены и настроены:
Проверьте, правильно ли настроен ваш экземпляр MySQL / InnoDB:
Load data infile
команда намного быстрее для серий вставок.select count(*) from table;
для innodb работает намного медленнее, чем для myisam.В нашей среде у нас была ситуация, когда один тип запросов на обновление был медленным. Расчетное время выполнения пакетной работы - 2 дня !!! После анализа журнала медленных запросов мы обнаружили, что для выполнения этого типа запроса на обновление требуется 4 секунды. Запрос выглядел так:
update table1 set field1=value1 where table1.field2=xx table2.field3=yy and table2.field4=zz
. После преобразования запроса обновления в запрос выбора и выполнения объяснения этого запроса выбора мы обнаруживаем, что этот тип запроса не использует индекс. После создания правильного индекса мы сократили время выполнения запроса на обновление до миллисекунд, и вся работа была завершена менее чем за два часа.
Полезные ссылки:
С конфигурацией innoDB по умолчанию вы будете ограничены тем, насколько быстро вы можете записывать и сбрасывать транзакции на диск. Если вы можете немного потерять ACID, поэкспериментируйте с innodb_flush_log_at_trx_commit. Установите 0 для записи и сброса журнала на диск примерно каждую секунду. Установите значение 1 (по умолчанию) для записи и сброса при каждой фиксации. Установите значение 2, чтобы записывать в файл журнала после каждой фиксации, но сбрасывать только один раз в секунду.
Если вы можете справиться с потерей единиц транзакций, это может быть отличным способом значительно повысить производительность записи.
Также обратите внимание на то, что делают ваши диски. RAID 10> RAID 5 для записи за счет дополнительного диска.
Примером проблем с блокировкой будет статус подключения в show full processlist;
Прочтите my.cnf
и документация MySQL. Параметры конфигурации очень хорошо документированы.
Вообще говоря, вы хотите, чтобы в памяти обрабатывалось как можно больше данных. Для оптимизации запросов это означает отказ от временных таблиц. Правильное применение индексов.
Настройка будет зависеть от вашего предпочтительного движка базы данных и архитектуры приложения. Для поиска в Интернете есть существенные ресурсы.
Включение мониторов Innodb может помочь определить причины блокировок и взаимоблокировок:
InnoDB - довольно хороший движок. Однако он сильно зависит от того, чтобы его «настроили». Одна вещь заключается в том, что если ваши вставки не в порядке увеличения первичных ключей, innoDB может занять немного больше времени, чем MyISAM. Это можно легко преодолеть, установив более высокий innodb_buffer_pool_size. Я предлагаю установить его на уровне 60-70% от общего объема оперативной памяти. Сейчас я использую 4 таких сервера в производстве, вставляя около 3,5 миллионов строк в минуту. У них уже есть около 3 терабайт. InnoDB это должно было быть из-за большого количества параллельных вставок. Есть и другие способы ускорить вставку. И я проверил некоторые.
Как я решаю проблемы с производительностью вставки и обновления в MySQL в веб-приложении, просто отключив автоматическую фиксацию и зафиксировав изменения один раз в java. Как предложено в документации mysql.