2017-09-14 3 views
-2

Forking mehrere Prozesse in PHP (Supervisor). Jeder erstellt eine Verbindung zur selben Mysql-DB und führt dieselbe SELECT-Abfrage parallel aus (Gearman). Wenn ich die Anzahl der Prozesse (d. H. Verbindungen mit gleicher Zeit) vergrößern und mehr parallele Abfragen führen, wird die Sendezeit in SHOW PROCESSLIST in jedem Prozess erhöht. Es ist eine einfache Auswahl mit Transaktionsebene READ UNCOMMITED. Ist es ein mysql config Problem? Oder SELECT-Abfrage verursachte Tabellensperren? Oder vielleicht Full Scan?Erhöhen Sie die Verbindungen zu mysql verursachen steigende Sendezeit in jeder Abfrage für die gleiche Abfrage

Server: Ubuntu 16.04.2 LTS. 1 CPU-Kern. MySQL 5.7.17. innodb_buffer_pool_size 12 GB

+2

Es könnte sich um Netzwerklatenz, Tabellenstruktur, Indizes und Abfrageeffizienz handeln. Daher sollten Sie mehr Details zu Ihrem Schema und Ihrer Abfrage angeben. – abeyaz

+0

Es verwendet 32 ​​Tabellen einschließlich Self Joins (13 eindeutige Tabellen), die in 3 Sekunden in einer Verbindung ausgeführt werden, aber in zwei parallelen dauert es 6 Sekunden in jedem Prozess und so weiter, wie ihre in der Warteschlange ausführt. Query ist groß genug mit vielen Joins, aber ohne Aggregation und Sortierung. nur eine Tabelle scannt 4262 Zeilen mit using_where und 45% gefiltert, andere mit index –

+0

Sieht so aus, als ob Sie die Tabelle in jeder Abfrage sperren. Verwenden Sie BEGIN TRANSACTION? – abeyaz

Antwort

0

Es benutzt Tabellen 32 einschließlich Selbst verbindet (13 einzigartige Tabellen) in 3 Sekunden in einer Verbindung der Ausführung

Gelangen die Details zu sehen. Klingt nach fehlenden oder unzureichenden Indizes.

Ist das „Entity-Attribut-Wert Wenn ja, haben Sie die Tipps hier gefolgt:.. http://mysql.rjweb.org/doc.php/index_cookbook_mysql#speeding_up_wp_postmeta

InnoDB nicht sperren Tabellen Aber es könnte tun Tabellenscans sein, die alle Zeilen sperren würde wieder Klänge wie schlechter Indizes und/oder Anfrageformulierung.

Bitte geben Sie SHOW CREATE TABLE für alle 13 Tabellen sowie SELECT und EXPLAIN SELECT ....

Wenn irgendeine Art von Schreib dort im Hintergrund passiert ist, könnte, dass die SELECT auswirken, auch in READ UNCOMMITTED Modus.

Mindestens 16 GB RAM?

Aufteilen, wie viele Prozesse? Wie viele CPU-Kerne haben Sie?

+0

1 CPU-Kern, 15 GB RAM sehen. Sogar 2 Prozesse führen dazu, dass die Zeit zweimal für jeden erhöht wird. Es gibt keine Einfüge-/Aktualisierungsaktivitäten für die gesamte Datenbank. Und ja, scheint eine schlechte Frage zu haben. Aber kann es nicht gut optimieren, weil es in API implementiert ist. Kann horizontales Sharding helfen? –

+0

Vielleicht CPU ist bei 100%, wenn es läuft? Das würde 3s für einen erklären; 6s für 2. Wenn Sie die generierte Abfrage nicht ändern können, können Sie Sharding nicht implementieren. Lassen Sie uns die Abfrage sehen. –

Verwandte Themen