Вы можете отключить многие конфигурации InnoDB для обеспечения долговечности, рискуя увеличить риск потери данных. Но иногда вы хотите управлять базой данных в Running with scissors mode, потому что исходные данные безопасно хранятся в другом месте, а копия в тестовой базе данных легко воссоздана.
Этот блог описывает Reducing MySQL durability for testing. Вы не увидите официальную рекомендацию MySQL для этого в любых целях, кроме тестирования!
Вот краткое описание изменений, которые вы можете сделать в вашем /etc/my.cnf:
[mysqld]
# log_bin (comment this out to disable the binary log)
# sync_binlog=0 (irrelevant if you don't use the binary log)
sync_frm=0
innodb_flush_log_at_trx_commit=0
innodb_doublewrite=0
innodb_checksums=0
innodb_support_xa=0
innodb_log_file_size=2048M # or more
Он также рекомендует увеличить innodb_buffer_pool_size
, но размер зависит от доступной оперативной памяти.
Для чего это стоит, я недавно попытался установить innodb_flush_log_at_trx_commit=0
в конфигурации в ящике Vagrant по умолчанию, который я построил для разработчиков в моей команде, но мне пришлось отменить это изменение, потому что это вызывало слишком много времени для разработчиков, которые были повреждены базы данных. Просто пища для размышлений. Иногда это не хороший компромисс.
Это не делает то, что вы просили (сохраняйте последние 1 ГБ данных в ОЗУ), поскольку он все еще работает с InnoDB с протоколом транзакций и сбрасывает журнал на диск один раз в секунду. В MySQL нет возможности отключить это.
Вы можете попробовать использовать MyISAM, который использует буферизованные записи для данных и индекса, и полагается на буфер файловой системы.Поэтому может кэшировать некоторые ваши данные (на практике я обнаружил, что буфер сбрасывается на диск довольно быстро, так что вы вряд ли будете иметь полный 1 ГБ в ОЗУ в любое время). MyISAM имеет другие проблемы, такие как отсутствие поддержки транзакций. Разработка с помощью MyISAM, а затем использование InnoDB в производстве может поднять вас на некоторые неудобные сюрпризы.
Вот несколько других изменений, которые вы могли бы внести в свои сеансы MySQL ради производительности, но я не рекомендую их даже для разработки, потому что это может изменить поведение вашего приложения.
set session unique_checks=0;
set session foreign_key_checks=0;
Некоторые люди рекомендуют использовать двигатель хранения MEMORY. У этого есть свои проблемы, такие как ограничения по размеру, блокировка таблицы и отсутствие поддержки транзакций.
Я также экспериментировал с попыткой поставить таблицы или tmpdir
на tmpfs, но я обнаружил, что вы не ожидаете увеличения производительности. В RDBMS есть накладные расходы, которые напрямую не связаны с дисковым вводом-выводом.
Возможно, вам также захочется поэкспериментировать с MyRocks, версией MySQL, включая механизм хранения RocksDB для MySQL. Facebook разработал его и выпустил в виде open-source. См. Facebook rocks an open source storage engine for MySQL (InfoWorld). Они обещают, что он сокращает объемы ввода-вывода, он сжимает данные и делает другие аккуратные вещи.
Но опять же, это правильное эмпирическое правило, чтобы ваша среда разработки была как можно ближе к вашей производственной среде. Использование другого механизма хранения создает риск не обнаруживать некоторые ошибки до тех пор, пока ваш код не достигнет производительности.
Итог: настройка MySQL не является волшебной пулей. Возможно, вам стоит подумать о разработке своего приложения, чтобы больше использовать микросервисы, кеши и очереди сообщений, а также меньше полагаться на прямые SQL-запросы.
Кроме того, я бы рекомендовал всегда предоставлять вашим разработчикам самую быструю рабочую станцию на базе SSD, которую вы можете себе позволить. Идите в верхнюю часть строки на CPU и RAM и скорость диска.
Вам действительно нужно настроить конфигурацию для своего приложения, для вашего сервера - нет универсального решения – Clive
Это не происходит на сервере. Это происходит на машине разработки. Невозможно настроить конфигурацию для приложения, так как программа не выполнена: она разрабатывается - все это является точкой разработки машины. Сохранение последних 1 ГБ транзакций в ОЗУ без их очистки на диске в моем случае будет достаточным. –
Я не уверен, почему этот вопрос занижен. Это интересный вариант использования, когда скорость MySQL имеет приоритет над надежностью. Механизм MyISAM или движок памяти могут работать хорошо. tpmfs также может быть полезным. – zedfoxus