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 .
Antworten:
Da Sie MySQL 5.5 ausführen, sollten Sie InnoDB für den Zugriff auf mehrere Kerne konfigurieren
Hier sind die Einstellungen, die Sie verwenden sollten
innodb_thread_concurrency legt die Obergrenze für die Anzahl gleichzeitiger Threads fest, die InnoDB offen halten kann. Die beste runde Nummer hierfür ist (2 x Anzahl der CPUs) + Anzahl der Festplatten. UPDATE : Wie ich aus erster Hand von der Percona NYC-Konferenz erfahren habe, sollten Sie dies auf 0 setzen, um InnoDB Storage Engine darauf aufmerksam zu machen, die beste Anzahl von Threads für die Umgebung zu finden, in der es ausgeführt wird.
innodb_concurrency_tickets legt die Anzahl der Threads fest, die die Parallelitätsprüfung ungestraft umgehen können. Nach Erreichen dieses Grenzwerts wird die Überprüfung der Thread-Parallelität wieder zur Norm.
innodb_commit_concurrency legt die Anzahl der gleichzeitigen Transaktionen fest, die festgeschrieben werden können. Da der Standardwert 0 ist, kann durch Nichteinstellung einer beliebigen Anzahl von Transaktionen gleichzeitig festgeschrieben werden.
innodb_thread_sleep_delay legt die Anzahl der Millisekunden fest, die ein InnoDB-Thread ruhen kann, bevor er erneut in die InnoDB-Warteschlange eingeht . Die Standardeinstellung ist 10000 (10 Sek.).
innodb_read_io_threads und innodb_write_io_threads (beide seit MySQL 5.1.38) weisen die angegebene Anzahl von Threads für Lese- und Schreibvorgänge zu. Die Standardeinstellung ist 4 und das Maximum ist 64.
innodb_replication_delay legt einem Slave eine Thread-Verzögerung auf, wenn innodb_thread_concurrency erreicht ist.
Hier sind meine früheren Beiträge zu MySQL 5.5 und zur Aktivierung mehrerer Kerne für InnoDB
Jun 01, 2012
: Ich habe 16 GB RAM. Wie soll ich MySQL Server konfigurieren?May 07, 2012
: MySQL Server-LeistungApr 26, 2012
: Ist die CPU-Leistung für einen Datenbankserver relevant?Mar 16, 2012
: Verwenden mehrerer Kerne für einzelne MySQL-Abfragen unter DebianOct 07, 2011
: Sollte ich eine andere Speicher-Engine als MyISAM verwenden, um diese Tabellen zu optimieren, oder sollte ich bessere Festplatten erhalten?Sep 20, 2011
: Multi Cores und MySQL PerformanceSep 12, 2011
: Kann MySQL mehr als einen Kern verwenden?quelle
Percona-führender MySQL-Berater bietet einen MySQL-Konfigurationsassistenten an . Hier können Sie
my.cnf/my.ini
abhängig von Ihrer Systemkonfiguration konfigurieren.Auch Percona-Leute haben ein Buch mit dem Titel " High Performance MySQL " veröffentlicht. Die dritte Ausgabe wurde kürzlich veröffentlicht und behandelt die Abstimmung sehr detailliert.
quelle
Speichernutzung: siehe http://mysql.rjweb.org/doc.php/memory (Die meisten Tunables machen nicht genug Unterschied, um eine Rolle zu spielen.)
max_heap_table_size = 4000M ist gefährlich hoch! Wenn 4 Benutzer solche benötigen, haben Sie nicht mehr genügend RAM und tauschen aus. Das Tauschen schadet der Leistung mehr als alles andere.
Abfragen, die länger als ein paar Sekunden dauern: Sie sollten zur Verbesserung untersucht werden. Bitte geben Sie SHOW CREATE TABLE an. TABELLENSTATUS ANZEIGEN; EXPLAIN SELECT
quelle
Sie können auch andere Optionen in Betracht ziehen. Wie PostgreSQL unter FreeBSD. Wenn Sie jedoch von Windows zu Linux wechseln, wird Ihre Leistung gesteigert.
quelle