Я запускаю сервер MySQL 5.5 на своїй робочій станції для наукового аналізу даних і цікавлюсь, як налаштувати MySQL для того, щоб отримати максимальну ефективність від нього. Типи запитів, які я зазвичай веду, передбачають приєднання 10-20 таблиць і можуть працювати досить довго, одна-кілька хвилин взагалі не є винятком. Лише дуже мало користувачів одночасно отримують доступ до бази даних (5 - максимум). Я перемістив сервер з Lenovo Thinkpad T61 з подвійним ядром 2,2 ГГц і 4 ГБ оперативної пам’яті на наступну нову машину з вибраними вручну компонентами:
- Intel i7 3770, 4х 3,4 ГГц (працює на 4х3,7 ГГц)
- Чпсет Z77
- 16 ГБ оперативної пам’яті DDR3 1600
- 64-розрядні Windows 7 Prof
- 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
Мені хотілося б знати, чи запропонував би хтось змінити вказані вище цифри чи навіть подальші налаштування, про які я не знаю.
Буду вдячний за будь-яке корисне зауваження.
Стів
EDIT: У мене є два запити, пов’язані з приєднаннями до 10-20 таблиць, і я запускав їх у своєму ноутбуку Lenovo та новому ПК. Запит №1 отримав 3m36 на новій машині проти 9m11s на ноутбуці; Запит №2 займав 22,5 секунди на робочій станції проти 48,5 на ноутбуці. Таким чином, швидкість виконання була покращена приблизно за коефіцієнт 2-2,5. На робочій станції не використовувалося навіть 50% оперативної пам’яті. Середнє завантаження процесора на чотирьох ядрах (як повідомляє Windows Task Manager) становило лише близько 13%. Навантаження на основі ядра (як повідомляється в Core Temp) становило близько 25-40% для ONE core, тоді як воно було <= 10% для інших, що вказує на те, що MySQL не використовує декілька ядер для одного запиту .