MySQL-Multithreading für eine einzelne Abfrage


8

Ich habe eine große Datenbank mit einer Größe von 8 GB und 9 Millionen Kontakte in dieser Datenbank. Wenn wir versuchen, alle Kontakte abzurufen, dauert es fast 1 oder 2 Stunden (in einigen Fällen führt dies zu einer Zeitüberschreitung), um alle Kontakte für die Ausführung einer einzelnen Abfrage abzurufen. Außerdem habe ich 8 CPUs und 24 GB RAM, Xeon-Prozessor, der MySQL-Prozess wird nicht auf die 8 CPUs verteilt. Meine Frage ist, ob wir Multithreading für eine einzelne Abfrage aktivieren können.

Warten auf Ihre Antwort


Sind die Tabellen mit diesen 9 Millionen Zeilen im InnoDB- oder MyISAM-Format?
Craig Efrein

Antworten:


8

Weder MyISAM noch InnoDB haben eine Multithread-Abfrageimplementierung. Auch andere XtraDB, TokuDB nicht. Es ist ein langjähriges Problem und eine Einschränkung von MySQL. Ich weiß nicht, dass die Einschränkung beim MySQL-Server liegt, sondern bei der Implementierung der Speicher-Engine. Niemand hat es jemals getan ...

Ich evaluiere derzeit den Spaltenspeicher InfiniDB und Infobright IEE. Beide unterstützen Multi-CPU-Abfragen und der Unterschied ist überwältigend (aus mehreren Gründen, aber die CPU ist offensichtlich).

Vielleicht möchten Sie sich Shard Query ansehen , einen Proxy für MySQL, der Ihre Abfrage in mehrere Abfragen aufteilt, diese in parallelen Prozessen ausführt und das aggregierte Ergebnis zurückgibt.


Es ist schrecklich, dass dies noch nicht behoben wurde. Innodb: Ich habe eine Einzelabfrage mit einer Lesegeschwindigkeit von 10-13 MB / s. Wenn ich den Lesevorgang in 20 Abfragen aufteile, kann ich einen Lesevorgang von bis zu 400 MB / s erreichen. Von einem IO-Punkt von wenigen ist es lächerlich, aber es ist nur, wie sich der Motor verhält.
John

Manchmal ist es schwierig zu erkennen, in welcher Reihenfolge die Abfrage ihre Aufgabe ausführen soll, aber ich denke, es wäre gut, wenn MySQL eine Option hätte. Die Bestätigung der Abfragereihenfolge ist unvorhersehbar. Außerdem scheint der Link zu Shard Query zu lauten: github.com/greenlion/swanhart-tools/tree/master/shard-query, da der veröffentlichte Link zu etwas Unwichtigem führt.
JVE999


0

MySQL bietet keine Möglichkeit, die Verarbeitung einer einzelnen Abfrage auf mehrere Threads aufzuteilen. Stattdessen empfehle ich, Parallelität in der Anwendungsschicht zu implementieren. MySQL verarbeitet gerne separate SELECT-Anweisungen parallel. Wenn Sie eine ID für die automatische Inkrementierung haben, können Sie die Tabelle mithilfe von in N Teile unterteilen SELECT ... WHERE id % N = 0. Verwenden Sie N Prozesse oder Threads, um jede select-Anweisung zu verarbeiten. Mehrere Prozesse sind etwas einfacher einzurichten als mehrere Threads. Mit xargs können Sie mehrere Prozesse parallel ausführen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.