Как улучшить скорость записи InnoDB в секунду базы данных MySQL
На моем сервере вставка записей в БД MySQL происходит очень медленно. Что касается состояния сервера, количество записей InnoDB в секунду составляет около 20.
Я не специалист, только что окончил университет. У меня нет большого опыта в этом. Как я могу улучшить скорость записи InnoDB? Если не модернизировать оборудование моего сервера, есть ли способ сделать это?
Мой сервер не очень хороший, поэтому я установил Microsoft Windows Server 2003 R2. Информация об оборудовании следующая:
- Процессор: Intel Xeon E5649 2,53 ГГц
- RAM: 2 ГБ
Любые комментарии, спасибо.
6 ответов
Здесь есть хороший набор советов:
Буферный пул часто нуждается в настройке, но он является универсальным как для чтения, так и для записи. При настройке записи в секунду вы также должны обратить внимание на:
- innodb_log_file_size
- innodb_flush_log_at_trx_commit
- innodb_flush_method
- log_bin и sync_binlog
Если вы используете InnoDB engine+local disk, попробуйте сравнить с innodb_flush_method = O_DSYNC. С O_DSYNC наши объемные вставки (окруженные TRANSACTION) были улучшены.
Отрегулируйте метод промывки
В некоторых версиях GNU/Linux и Unix сброс файлов на диск с помощью вызова Unix fsync() (который InnoDB использует по умолчанию) и подобных методов на удивление медленен. Если производительность записи в базу данных является проблемой, проведите тесты с параметром innodb_flush_method, установленным в O_DSYNC.
https://dev.mysql.com/doc/refman/5.5/en/optimizing-innodb-diskio.html
Некоторые намеки:
- Минимизируйте количество индексов - будет меньше обслуживания индексов. Это очевидный компромисс с производительностью SELECT.
- Максимизируйте количество INSERT на транзакцию - "цена долговечности" будет меньше (т.е. физическая запись на диск может выполняться в фоновом режиме, пока остальная часть транзакции все еще выполняется, если транзакция достаточно длинная). Одна большая транзакция, как правило, будет быстрее, чем многие маленькие транзакции, но это, очевидно, зависит от реальной логики, которую вы пытаетесь реализовать.
- Переместите таблицу в более быстрое хранилище, такое как SSD. Чтения могут быть кэшированы, но длительная транзакция должна быть физически записана на диск, поэтому простого кеширования недостаточно.
Кроме того, было бы полезно, если бы вы могли показать нам вашу точную структуру базы данных и точный оператор INSERT, который вы используете.
измените свою конфигурацию для сервера mysql
innodb_flush_log_at_trx_commit = 0
затем перезапустите сервер mysql
Пожалуйста, установите innodb_buffer_pool_size в 512M. Это может увеличить производительность
SET GLOBAL innodb_buffer_pool_size=512M
Рекомендации могут отличаться в зависимости от вашей реализации. Вот некоторые заметки, скопированные непосредственно из документации MySQL:
Советы по массовой загрузке данных
При импорте данных в InnoDB убедитесь, что в MySQL не включен режим автоматической фиксации, поскольку для каждой вставки требуется сброс журнала на диск. Чтобы отключить автокоммит во время операции импорта, окружите его инструкциями SET autocommit и COMMIT.
Используйте многострочный синтаксис INSERT, чтобы уменьшить накладные расходы на связь между клиентом и сервером, если вам нужно вставить много строк:
ВСТАВЛЯЙТЕ В ВАШИ ЦЕННЫЕ ЗНАЧЕНИЯ (1,2), (5,5), ...;
Если вы делаете огромную пакетную вставку, попробуйте избегать "select from last_insert_id", который следует за вставкой, поскольку это серьезно замедляет вставки (до порядка 6-минутной вставки в 13-часовую вставку), если вам нужен номер для другая вставка (возможно, подтаблица) назначает ваши собственные номера идентификаторам (это, очевидно, работает, только если вы уверены, что никто другой не делает вставки одновременно).
Как уже упоминалось, вы можете увеличить размер пула буферов InnoDB (переменная innodb_buffer_pool_size). Как правило, это хорошая идея, поскольку размер по умолчанию довольно мал, и большинство систем могут предоставить больше памяти пулу. Это увеличит скорость большинства запросов, особенно SELECT (так как большее количество записей будет храниться в буфере между запросами). Буфер вставки также является частью пула буферов и будет хранить недавно вставленные записи, что увеличит скорость, если вы будете основывать будущие вставки на значениях из предыдущих вставок. Надеюсь это поможет:)