Wenn es eine Sache gibt, die ich über MySQL sagen kann, ist die Tatsache, dass InnoDB, seine transaktionale (ACID-kompatible) Speicher-Engine, tatsächlich Multithread-fähig ist. Es ist jedoch so multithreadingfähig, wie SIE ES KONFIGURIEREN !!! InnoDB ist auch in einer Single-CPU-Umgebung mit seinen Standardeinstellungen sofort einsatzbereit. Um die Multithreading-Funktionen von InnoDB nutzen zu können, müssen Sie zahlreiche Optionen aktivieren.
innodb_thread_concurrency legt die Obergrenze für die Anzahl gleichzeitiger Threads fest, die InnoDB offenhalten kann. Die am besten einzustellende Rundenzahl ist (2 x Anzahl der CPUs) + Anzahl der Festplatten. UPDATE : Wie ich aus erster Hand auf der Percona NYC-Konferenz erfahren habe, sollten Sie diesen Wert auf 0 setzen, um InnoDB Storage Engine zu benachrichtigen, damit die beste Anzahl von Threads für die Umgebung ermittelt wird, in der sie ausgeführt wird.
innodb_concurrency_tickets legt die Anzahl der Threads fest, die die Prüfung auf Parallelität ungestraft umgehen können. Nachdem dieses Limit erreicht ist, wird die Thread-Parallelitätsprüfung wieder zur Norm.
innodb_commit_concurrency legt die Anzahl gleichzeitiger Transaktionen fest, die festgeschrieben werden können. Da der Standardwert 0 ist, können durch Nichteinstellung beliebig viele Transaktionen gleichzeitig festgeschrieben werden.
innodb_thread_sleep_delay legt die Anzahl der Millisekunden fest, die ein InnoDB-Thread inaktiv sein kann, bevor er erneut in die InnoDB-Warteschlange eingibt . 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 setzt einem Slave eine Thread-Verzögerung auf, wenn innodb_thread_concurrency erreicht ist.
innodb_read_ahead_threshold ermöglicht das lineare Lesen der festgelegten Anzahl von Speicherbereichen (64 Seiten [Seite = 16 KB]), bevor auf asynchrones Lesen umgeschaltet wird.
Die Zeit würde mir entgehen, wenn ich mehr Optionen nennen würde. Sie können darüber in der MySQL-Dokumentation nachlesen .
Die meisten Leute kennen diese Funktionen nicht und sind ziemlich zufrieden damit, dass InnoDB nur ACID-kompatible Transaktionen durchführt. Wenn Sie eine dieser Optionen anpassen, geschieht dies auf eigene Gefahr.
Ich habe mit MySQL 5.5 Multiple Buffer Pool Instances (162 GB in 9 Buffer Pool Instances) gespielt und versucht, Daten auf diese Weise automatisch im Speicher zu partitionieren. Einige Experten sagen, dass dies zu einer Leistungsverbesserung von 50% führen sollte. Was ich bekam, war eine Menge Thread-Sperren, die InnoDB tatsächlich crawlen ließen. Ich habe auf 1 Puffer (162GB) umgestellt und alles war wieder in Ordnung in der Welt. Ich nehme an, Sie benötigen Percona-Experten, die Ihnen zur Verfügung stehen, um dies einzustellen. Ich werde morgen auf der Percona MySQL-Konferenz in New York sein und danach fragen, ob sich die Gelegenheit bietet.
Zusammenfassend lässt sich sagen, dass sich InnoDB in einem Multi-CPU-Server aufgrund der Standardeinstellungen für Multithreading-Vorgänge jetzt gut verhält. Sie zu optimieren erfordert große Sorgfalt, große Geduld, gute Dokumentation und guten Kaffee (oder Red Bull, Jolt usw.).
Guten Morgen, guten Abend und gute Nacht !!!
UPDATE 2011-05-27 20:11
Kam am Donnerstag von der Percona MySQL-Konferenz in New York zurück . Was für eine Konferenz. Ich habe viel gelernt, habe aber eine Antwort erhalten, die ich in Bezug auf InnoDB untersuchen werde. Ich wurde von Ronald Bradford darüber informiert, dass das Setzen von innodb_thread_concurrency auf 0 InnoDB intern über die beste Vorgehensweise bei gleichzeitiger Verwendung von Threads entscheiden lässt. Ich werde damit in MySQL 5.5 weiter experimentieren.
UPDATE 2011-06-01 11:20
InnoDB ist nach einer langen Abfrage ACID-konform und funktioniert mit MultiVersion Concurrency Control sehr gut . Transaktionen sollten Isolationsstufen aufweisen (standardmäßig wiederholbare Lesevorgänge), die verhindern, dass andere Benutzer auf Daten zugreifen können.
Bei Multi-Core-Systemen hat InnoDB einen langen Weg zurückgelegt. In der Vergangenheit konnte InnoDB in einer Multicore-Umgebung keine gute Leistung erbringen. Ich erinnere mich, dass ich mehrere mysql-Instanzen auf einem einzelnen Server ausführen musste, um die mehreren Kerne zu erhalten, um die mehreren mysqld-Prozesse auf die CPUs zu verteilen. Dank Percona und später MySQL (eh, Oracle, das macht mich immer noch wahnsinnig) ist dies nicht mehr erforderlich, da sie InnoDB zu einer ausgereifteren Speicher-Engine entwickelt haben, die ohne viel Tuning auf die Kerne zugreifen kann. Die derzeitige Instanz von InnoDB kann auf einem einzelnen Core-Server problemlos ausgeführt werden.