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
Antworten:
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.
quelle
Ich habe kürzlich einen guten Blog-Beitrag über einige Ansätze dazu gelesen.
http://www.mysqlperformanceblog.com/2014/01/07/increasing-slow-query-performance-with-parallel-query-execution/
quelle
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.quelle