Ich verwende auf meiner Workstation einen MySQL 5.5-Server für die wissenschaftliche Datenanalyse und frage mich, wie ich MySQL konfigurieren kann, um die Leistung optimal zu nutzen. Die Abfragetypen, die ich normalerweise ausführe, umfassen Verknüpfungen von 10 bis 20 Tabellen und können ziemlich lange ausgeführt werden, wobei ein bis mehrere Minuten überhaupt keine Ausnahme bilden. Nur sehr wenige Benutzer greifen gleichzeitig auf die Datenbank zu (maximal 5). Ich habe den Server von einem Lenovo Thinkpad T61 mit 2,2 GHz Dual Core und 4 GB RAM auf den folgenden brandneuen Computer mit handverlesenen Komponenten umgestellt:
- Intel i7 3770, 4x 3,4 GHz (läuft bei 4x3,7 GHz)
- Z77-Chipsatz
- 16 GB DDR3 1600 RAM
- Windows 7 Prof 64-Bit
- Windows- und MySQL-Server werden auf einem SSD-Laufwerk der Intel 520-Serie ausgeführt.
Erste Tests (die gleiche Abfrage auf beiden Computern ausführen) zeigten eine deutliche Verbesserung der Geschwindigkeit für den neuen, aber die Abfragen nehmen immer noch viel Zeit in Anspruch und ich hatte mehr Schub erwartet. Die fraglichen Abfragen sind ziemlich gut optimiert, dh alle Tabellen haben den richtigen Schlüssel, der auch ab "EXPLAIN Extended" verwendet wird.
Nun zu meinen aktuellen MySQL-Einstellungen: Zuerst sollte ich erwähnen, dass ich vor langer Zeit von MyISAM zu Innodb gewechselt bin.
Einige meiner my.ini-Optimierungen (dh Abweichungen von den Standardeinstellungen):
# 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
Ich würde gerne wissen, ob jemand Änderungen an den oben genannten Zahlen oder noch weitere Einstellungen vorschlagen würde, die ich nicht kenne.
Ich würde mich über jede hilfreiche Bemerkung freuen.
Steve
BEARBEITEN: Ich habe zwei Abfragen mit Joins in 10 bis 20 Tabellen und habe sie auf meinem Lenovo Notebook und dem neuen PC ausgeführt. Abfrage Nr. 1 dauerte auf dem neuen Computer 3 Minuten 36 Sekunden gegenüber 9 Minuten 11 auf dem Laptop. Abfrage Nr. 2 dauerte 22,5 Sekunden auf der Workstation gegenüber 48,5 Sekunden auf dem Laptop. So wurde die Ausführungsgeschwindigkeit um etwa den Faktor 2-2,5 verbessert. Auf der Workstation wurden nicht einmal 50% des Arbeitsspeichers verwendet. Die durchschnittliche CPU-Auslastung der vier Kerne (wie vom Windows Task-Manager angegeben) betrug nur etwa 13%. Die Auslastung pro Kern (wie von Core Temp angegeben) betrug für EINEN Kern etwa 25-40%, während sie für die anderen <= 10% betrug, was darauf hinweist, dass MySQL nicht mehrere Kerne für eine einzelne Abfrage verwendet .