Я использую сервер MySQL 5.5 на своей рабочей станции для анализа научных данных и задаюсь вопросом, как настроить MySQL, чтобы получить максимальную отдачу от него с точки зрения производительности. Типы запросов, которые я обычно выполняю, включают в себя соединения из 10-20 таблиц и могут выполняться довольно долго, от одной до нескольких минут, не являясь исключением. Только очень немногие пользователи имеют доступ к базе данных одновременно (5 - максимум). Я переместил сервер с Lenovo Thinkpad T61 с двухъядерным процессором 2,2 ГГц и 4 ГБ оперативной памяти на следующую совершенно новую машину с выбранными вручную компонентами:
- Intel i7 3770, 4x 3,4 ГГц (работает при 4x3,7 ГГц)
- Чипсет Z77
- 16 ГБ оперативной памяти DDR3 1600
- Windows 7 Prof 64-битная
- Сервер Windows и MySQL работает на SSD-накопителе серии Intel 520.
Первые тесты (выполнение одного и того же запроса на обеих машинах) показали определенное улучшение скорости для нового, но запросы все еще занимают много времени, и я ожидал большего ускорения. Запросы, о которых идет речь, довольно хорошо оптимизированы, т. Е. Все таблицы имеют надлежащий ключ, который также используется для «расширенного объяснения».
Теперь перейдите к моим текущим настройкам MySQL: сначала я должен упомянуть, что я перешел из MyISAM в Innodb очень давно.
Некоторые из моих настроек my.ini (то есть отклонения от настроек по умолчанию):
# Maximum size for internal (in-memory) temporary tables. If a table
# grows larger than this value, it is automatically converted to disk
# based table This limitation is for a single table. There can be many
# of them.
#tmp_table_size=35M
tmp_table_size=4000M
max_heap_table_size=4000M
# InnoDB, unlike MyISAM, uses a buffer pool to cache both indexes and
# row data. The bigger you set this the less disk I/O is needed to
# access data in tables. On a dedicated database server you may set this
# parameter up to 80% of the machine physical memory size. Do not set it
# too large, though, because competition of the physical memory may
# cause paging in the operating system. Note that on 32bit systems you
# might be limited to 2-3.5G of user level memory per process, so do not
# set it too high.
#innodb_buffer_pool_size=96M
innodb_buffer_pool_size=800M
general-log
expire_logs_days = 60
general_log_file = "F:/my_query_mysql.log"
log-output = TABLE
optimizer_search_depth = 0 #meant to cure the "statistics state" bug in some queries
Я хотел бы знать, будет ли кто-то предлагать изменения вышеуказанных номеров или даже дополнительные настройки, о которых я не знаю.
Буду признателен за полезное замечание.
Стив
РЕДАКТИРОВАТЬ: у меня есть два запроса, связанные с объединениями по 10-20 таблицам, и запустил их на моем ноутбуке Lenovo и новом ПК. Запрос № 1 занял 3m36s на новой машине против 9m11s на ноутбуке; Запрос №2 занял 22,5 с на рабочей станции против 48,5 с на ноутбуке. Таким образом, скорость выполнения была улучшена примерно в 2-2,5 раза. На рабочей станции не было использовано даже 50% оперативной памяти. Средняя загрузка ЦП по четырем ядрам (по данным диспетчера задач Windows) составила всего около 13%. Нагрузка для каждого ядра (как сообщает Core Temp) составляла около 25-40% для ОДНОГО ядра, в то время как для остальных она составляла <= 10%, что указывает на то, что MySQL не использует несколько ядер для одного запроса. ,