Sto eseguendo un server MySQL 5.5 sulla mia stazione di lavoro per l'analisi dei dati scientifici e mi chiedo come configurare MySQL per ottenere il massimo dalle prestazioni. I tipi di query che eseguo in genere riguardano join di 10-20 tabelle e possono essere eseguiti per un periodo piuttosto lungo, da uno a diversi minuti senza alcuna eccezione. Solo pochissimi utenti accedono al database contemporaneamente (5 è il massimo). Ho spostato il server da un Lenovo Thinkpad T61 con un Dual Core da 2,2 GHz e 4 GB di RAM alla seguente macchina nuova di zecca con componenti selezionati manualmente:
- Intel i7 3770, 4x 3,4 GHz (in esecuzione @ 4x3,7 GHz)
- Chipset Z77
- 16 GB di RAM DDR3 1600
- Windows 7 Prof 64-bit
- I server Windows e MySQL funzionano su un'unità SSD Intel serie 520.
I primi test (eseguendo la stessa query su entrambe le macchine) hanno mostrato un miglioramento definitivo della velocità per quello nuovo, ma le query richiedono ancora molto tempo e mi aspettavo un aumento maggiore. Le query in questione sono abbastanza ben ottimizzate, vale a dire che tutte le tabelle hanno una chiave corretta che viene anche utilizzata come "spiegazione estesa".
Ora alle mie attuali impostazioni di MySQL: per prima cosa dovrei menzionare che sono passato da MyISAM a Innodb molto tempo fa.
Alcune delle mie modifiche a my.ini (es. Partenze dalle impostazioni predefinite):
# 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
Mi piacerebbe sapere se qualcuno suggerirebbe modifiche ai numeri precedenti o anche ulteriori impostazioni che non conosco.
Gradirei qualsiasi commento utile.
Steve
EDIT: Ho due query che coinvolgono join su 10-20 tavoli e le ho eseguite sul mio notebook Lenovo e sul nuovo PC. La query n. 1 ha richiesto 3m36s sulla nuova macchina contro 9m11s sul laptop; La query n. 2 ha richiesto 22,5 secondi sulla workstation rispetto a 48,5 secondi sul laptop. Quindi la velocità di esecuzione è stata migliorata di circa il fattore 2-2,5. Sulla workstation non è stato utilizzato nemmeno il 50% della RAM. Il carico medio della CPU tra i quattro core (come riportato da Task Manager di Windows) era solo del 13% circa. Il carico su base core (come riportato da Core Temp) era di circa il 25-40% per ONE core, mentre era <= 10% per gli altri, indicando che MySQL non utilizza più core per una singola query .