Я использую сервер 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 не использует несколько ядер для одного запроса. ,
Ответы:
Поскольку вы работаете с MySQL 5.5, вы можете рассмотреть возможность настройки InnoDB для доступа к нескольким ядрам.
Вот настройки, которые вы должны использовать
innodb_thread_concurrency устанавливает верхнюю границу количества одновременных потоков, которые InnoDB может держать открытыми. Лучшее число раундов для этого - (2 X Количество процессоров) + Количество дисков. ОБНОВЛЕНИЕ : Как я узнал из первых рук на конференции Percona NYC Conference, вы должны установить это значение в 0, чтобы предупредить InnoDB Storage Engine, чтобы найти лучшее число потоков для среды, в которой он работает.
innodb_concurrency_tickets устанавливает количество потоков, которые могут безнаказанно обходить проверку параллелизма. После того, как этот предел достигнут, проверка параллельности потока снова становится нормой.
innodb_commit_concurrency устанавливает количество одновременных транзакций, которые могут быть зафиксированы. Поскольку значение по умолчанию равно 0, не устанавливая его, можно одновременно фиксировать любое количество транзакций.
innodb_thread_sleep_delay устанавливает количество миллисекунд, в течение которых поток InnoDB может бездействовать до повторного входа в очередь InnoDB. По умолчанию 10000 (10 секунд).
innodb_read_io_threads и innodb_write_io_threads (оба начиная с MySQL 5.1.38) выделяют указанное количество потоков для чтения и записи. По умолчанию 4 и максимум 64.
innodb_replication_delay налагает задержку потока на ведомое устройство, когда достигается innodb_thread_concurrency.
Вот мои прошлые посты о MySQL 5.5 и активации нескольких ядер для InnoDB
Jun 01, 2012
: У меня есть 16 ГБ оперативной памяти, как мне настроить MySQL Server?May 07, 2012
: Производительность MySQL сервераApr 26, 2012
: Соответствует ли производительность процессора серверу баз данных?Mar 16, 2012
: Использование нескольких ядер для отдельных запросов MySQL в DebianOct 07, 2011
: Следует ли мне использовать механизм хранения, отличный от MyISAM, для оптимизации этих таблиц или лучше получить диски?Sep 20, 2011
: Многоядерность и производительность MySQLSep 12, 2011
: Можно ли заставить MySQL использовать более одного ядра?источник
Percona - ведущий консультант MySQL предлагает мастера настройки MySQL . Это позволяет вам настраивать в
my.cnf/my.ini
зависимости от конфигурации вашей системы.Также сотрудники Percona выпустили книгу под названием « High Performance MySQL ». Третье издание было выпущено недавно и подробно описывает тюнинг.
источник
Использование памяти: см http://mysql.rjweb.org/doc.php/memory (Большинство параметров настройки не будет делать достаточно разницы в материю.)
max_heap_table_size = 4000M опасно высоко! Если 4 пользователя нуждаются в этом, значит, у вас недостаточно оперативной памяти и вы подкачали. Обмен вредит производительности гораздо больше, чем что-либо еще.
Запросы, занимающие более нескольких секунд: они должны быть изучены для улучшения; пожалуйста, предоставьте SHOW CREATE TABLE; ПОКАЗАТЬ СТОЛ СТАТУС; ОБЪЯСНИТЬ ВЫБОР
источник
Вы можете рассмотреть варианты otger тоже. Например, PostgreSQL на FreeBSD. Но переход с Windows на Linux повысит вашу производительность.
источник