Eine buchstäblich verrückte Antwort, aber wenn Sie eine Art Replikationssystem eingerichtet haben (für ein System mit einer Milliarde Zeilen hoffe ich), können Sie einen groben Schätzer (wie MAX(pk)
) verwenden und diesen Wert durch die Anzahl der Slaves teilen Sie haben mehrere Abfragen parallel ausgeführt.
Zum größten Teil würden Sie die Abfragen auf der Grundlage des besten Schlüssels (oder des Primärschlüssels, denke ich) auf mehrere Slaves verteilen (wir werden 250000000 als unsere Zeilen / Slaves verwenden):
-- First slave
SELECT COUNT(pk) FROM t WHERE pk < 250000000
-- Ith slave where 2 <= I <= N - 1
SELECT COUNT(pk) FROM t WHERE pk >= I*250000000 and pk < (I+1)*250000000
-- Last slave
SELECT COUNT(pk) FROM t WHERE pk > (N-1)*250000000
Sie benötigen jedoch nur SQL. Was für eine Büste. Ok, nehmen wir an, Sie sind ein Sadomasochist. Auf dem Master (oder dem nächsten Slave) müssten Sie höchstwahrscheinlich eine Tabelle dafür erstellen:
CREATE TABLE counter_table (minpk integer, maxpk integer, cnt integer, slaveid integer)
Anstatt nur die Auswahl in Ihren Slaves auszuführen, müssten Sie eine Einfügung durchführen, ähnlich wie folgt:
INSERT INTO counter_table VALUES (I*25000000, (I+1)*250000000, (SELECT COUNT(pk) FROM ... ), @@SLAVE_ID)
Möglicherweise treten Probleme mit Slaves auf, die auf dem Master in eine Tabelle schreiben. Möglicherweise müssen Sie noch mehr Sadis bekommen - ich meine, kreativ:
-- A table per slave!
INSERT INTO counter_table_slave_I VALUES (...)
Sie sollten am Ende einen Slave haben, der zuletzt im Pfad vorhanden ist, der vom Replikationsdiagramm relativ zum ersten Slave durchlaufen wird. Dieser Slave sollte jetzt alle anderen Zählerwerte haben und seine eigenen Werte haben. Aber wenn Sie fertig sind, werden wahrscheinlich Zeilen hinzugefügt, sodass Sie eine weitere einfügen müssen, um das aufgezeichnete maximale pk in Ihrer counter_table und das aktuelle maximale pk zu kompensieren.
Zu diesem Zeitpunkt müssten Sie eine Aggregatfunktion ausführen, um die Gesamtzahl der Zeilen zu ermitteln. Dies ist jedoch einfacher, da Sie sie höchstens auf der Zeile "Anzahl der Slaves, die Sie haben und ändern" ausführen würden.
Wenn Sie in der Situation sind, dass Sie separate Tabellen in den Slaves haben, können UNION
Sie alle Zeilen abrufen, die Sie benötigen.
SELECT SUM(cnt) FROM (
SELECT * FROM counter_table_slave_1
UNION
SELECT * FROM counter_table_slave_2
UNION
...
)
Oder Sie wissen, seien Sie ein bisschen weniger verrückt und migrieren Sie Ihre Daten auf ein verteiltes Verarbeitungssystem oder verwenden Sie eine Data Warehousing-Lösung (die Ihnen auch in Zukunft eine beeindruckende Datenverarbeitung ermöglicht).
Beachten Sie, dass dies davon abhängt, wie gut Ihre Replikation eingerichtet ist. Da der primäre Engpass höchstwahrscheinlich ein dauerhafter Speicher ist, werden Sie wahrscheinlich langsamer als nur auf einen einzigen warten, wenn Sie über einen groben Speicher oder schlecht getrennte Datenspeicher mit starkem Nachbarrauschen verfügenSELECT COUNT(*) ...
Wenn Sie jedoch eine gute Replikation haben, sollten Ihre Geschwindigkeitsgewinne in direktem Zusammenhang mit der Anzahl oder den Slaves stehen. Wenn die alleinige Ausführung der Zählabfrage 10 Minuten dauert und Sie 8 Slaves haben, können Sie Ihre Zeit auf weniger als ein paar Minuten verkürzen. Vielleicht eine Stunde, um die Details dieser Lösung auszubügeln.
Natürlich würden Sie nie wirklich eine erstaunlich genaue Antwort erhalten, da diese verteilte Lösung einige Zeit in Anspruch nimmt, in der Zeilen gelöscht und eingefügt werden können, aber Sie können versuchen, eine verteilte Sperre von Zeilen in derselben Instanz zu erhalten und eine genaue Anzahl zu erhalten der Zeilen in der Tabelle für einen bestimmten Zeitpunkt.
Tatsächlich scheint dies unmöglich zu sein, da Sie im Grunde genommen an einer reinen SQL-Lösung festhalten und ich glaube nicht, dass Ihnen ein Mechanismus zur Verfügung gestellt wird, mit dem eine gesplittete und gesperrte Abfrage sofort über mehrere Slaves ausgeführt werden kann. Vielleicht, wenn Sie die Kontrolle über die Replikationsprotokolldatei hätten ... was bedeutet, dass Sie buchstäblich Slaves für diesen Zweck hochfahren würden, was zweifellos langsamer ist, als die Zählabfrage ohnehin nur auf einem einzelnen Computer auszuführen.
Da sind also meine zwei Pennys 2013.