Austausch von Ideen zur Verarbeitung von Millionen von Daten in einer einzigen MySQL-Tabelle

Austausch von Ideen zur Verarbeitung von Millionen von Daten in einer einzigen MySQL-Tabelle

Projekthintergrund

Während der Verarbeitung muss Feld A heute Morgen aktualisiert werden. Am Nachmittag schließt das Crawler-Team das Crawlen der Spezifikationen oder Bilder ab und muss die Bilder und Spezifikationsfelder aktualisieren. Aufgrund des tiefen Umblätterns von zig Millionen Seiten in einer einzigen Tabelle wird die Verarbeitungsgeschwindigkeit immer langsamer.

wähle a,b,c aus db.tb Limit 10000 Offset 9000000

Aber die Zeit ist begrenzt. Gibt es eine bessere Möglichkeit, dieses Problem zu lösen?

Verbesserungsideen

Gibt es eine Möglichkeit, Daten zu aktualisieren, ohne tief in die Seiten zu blättern?
Ja, mithilfe der automatisch inkrementierten ID-Spalte

Dateneigenschaften beobachten

Diese einzelne Tabelle verfügt über eine automatisch inkrementierende ID-Spalte und ist der Primärschlüssel. Die ideale Methode zum Abfragen und Aktualisieren von Daten basiert auf der Indexspalte.

Wählen Sie a, b, c aus db.tb, wobei id=9999999;
Aktualisiere db.tb, setze a=x, wobei id=9999999;

Mehrfachverarbeitung

Jeder Prozess verarbeitet Daten innerhalb eines bestimmten ID-Bereichs, wodurch Deep Page Flipping vermieden wird und mehrere Prozesse gleichzeitig Daten verarbeiten können.
Eine Verbesserung der Datenabfragegeschwindigkeit verbessert auch die Datenverarbeitungsgeschwindigkeit.
Hier ist die Aufgabenzuweisungsfunktion, die ich als Referenz geschrieben habe:

def Missionshandler (alle Missionen, Arbeiter-Missionsgröße):
    """
    Die Aufgabenliste wird basierend auf der Gesamtzahl der Aufgaben und der Anzahl der Aufgaben jedes Mitarbeiters berechnet. Die Elemente der Aufgabenliste sind (Aufgabenstart-ID, Aufgabenende-ID).
    Beispiel: Die Gesamtzahl der Aufgaben beträgt 100 und die Anzahl der Aufgaben für jeden Mitarbeiter beträgt 40. Dann lautet die Aufgabenliste: [(1, 40), (41, 80), (81, 100)]
    :param all_missions: Gesamtzahl der Missionen :param worker_mission_size: maximale Anzahl der Missionen für jeden Arbeiter :return: [(start_id, end_id), (start_id, end_id), ...]
    """
    Arbeiter_Missions-IDs = []
    aktuelle_id = 0
    während aktuelle_id <= alle_missionen:
        start_id = all_missions wenn current_id + 1 >= all_missions sonst current_id + 1
        end_id = alle_Missionen wenn aktuelle_ID + Arbeiter-Missionsgröße >= alle_Missionen sonst aktuelle_ID + Arbeiter-Missionsgröße
        wenn start_id == end_id:
            wenn worker_mission_ids[-1][1] == start_id:
                brechen
        worker_mission_ids.anhängen((start_id, end_id))
        aktuelle_ID += Arbeiter-Missionsgröße

    Arbeiter-Missions-IDs zurückgeben

Angenommen, der Maximalwert einer einzelnen Tabellen-ID beträgt 100 und wir möchten, dass jeder Prozess 20 IDs verarbeitet. Dann sieht die Aufgabenliste wie folgt aus:

>>> Missionshandler (100, 40)
[(1, 40), (41, 80), (81, 100)]

Also,
Prozess 1 muss nur Daten mit IDs zwischen 1 und 40 verarbeiten;
Prozess 2 muss nur Daten mit IDs zwischen 41 und 80 verarbeiten;
Prozess 3 muss nur Daten mit IDs zwischen 81 und 100 verarbeiten.

von concurrent.futures importiere ProcessPoolExecutor


def main():
    # Maximalwert der Auto-Increment-ID max_id = 30000000
    # Von einem einzelnen Worker verarbeitetes Datenvolumen worker_mission_size = 1000000
    # Verwenden Sie mehrere Prozesse, um Missionen zu verarbeiten = Missionshandler (max_id, Worker_Missionsgröße).
    Arbeiter = []
    Executor = ProcessPoolExecutor()
    für idx, Mission in enumerate(Missionen):
        Start-ID, End-ID = Mission
        Arbeiter.Anhängen(Executor.Senden(Datenhandler, Start-ID, End-ID, IDX))


auf def data_handler(start_id, end_id, worker_id):
    passieren

Zusammenfassung der Ideen

  1. Vermeiden Sie Deep Page Flipping und verwenden Sie die Auto-Increment-ID, um Daten und Daten abzufragen
  2. Verarbeiten von Daten mithilfe mehrerer Prozesse

Kenntnisse in der Datenverarbeitung

Aufzeichnung der Daten-IDs erfolgreicher und fehlgeschlagener Verarbeitungen für spätere Folgeverarbeitungen

# Verwenden Sie eine andere Tabelle, um den Verarbeitungsstatus aufzuzeichnen. Einfügen in db.tb_handle_status (row_id, success) Werte (999, 0);

Die Ausnahmeerfassung erfolgt innerhalb der Schleife, um ein abnormales Beenden des Programms zu verhindern.

auf def data_handler(start_id, end_id, worker_id):
    #Datenverbindung conn, cursor = mysql()
    aktuelle_id = start_id
        versuchen:
            während aktuelle_id <= end_id:
                versuchen:
                    # TODO Datenverarbeitungscode-Pass

                außer Ausnahme als e:
                    # TODO-Datensatzverarbeitungsergebnisse# Daten werden zur nächsten current_id += 1 verschoben.
                    weitermachen
                anders:
                    # Keine Ausnahme, fahren Sie mit der Verarbeitung der nächsten Daten fort current_id += 1
        außer Ausnahme als e:
            gibt 'worker_id({})' zurück: result({})'.format(worker_id, False)
        Endlich:
            # Datenbankressourcenfreigabe cursor.close()
            conn.close()

        gibt 'worker_id({})' zurück: result({})'.format(worker_id, True)

Aktualisieren Sie Datenbankdaten so oft wie möglich per Batchübermittlung

sql = """Aktualisiere db.tb, setze a=%s, b=%s, wobei id=%s"""
Werte = [
            ('a_Wert', 'b_Wert', 9999),
            ('a_Wert', 'b_Wert', 9998),
            ...
         ]
# Batch-Übermittlung zur Reduzierung der Netzwerk-E/A und der Häufigkeit des Sperrenerwerbs cursor.executemany(sql, values)

Oben ist der detaillierte Inhalt der Idee, zig Millionen Daten in einer einzigen MySQL-Tabelle zu verarbeiten. Weitere Informationen zur Verarbeitung zig Millionen Daten in einer einzigen MySQL-Tabelle finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • Wie lassen sich MySQL-Tabellen mit mehreren zehn Millionen Daten optimieren?
  • Praktische Erfahrung bei der Optimierung von MySQL-Tabellen mit mehreren zehn Millionen Daten

<<:  Analyse und Lösungen für Probleme bei der Verwendung von Label-Tags

>>:  So öffnen Sie eine Seite in einem Iframe

Artikel empfehlen

CSS-Code zum Anordnen von Fotos in Moments

Zunächst können Sie Moments öffnen und mehrere La...

Kann die wiederholbare Leseebene von MySQL Phantomlesevorgänge lösen?

Einführung Als ich mehr über die Datenbanktheorie...

Analyse des MySQL-Beispiels DTID Master-Slave-Prinzip

Inhaltsverzeichnis 1. Grundkonzepte von GTID 2. G...

So erben Sie die CSS-Zeilenhöhe

Wie wird die Zeilenhöhe vererbt?Schreiben Sie ein...

So verbergen und fälschen Sie die Versionsnummer in Nginx

1. Verwenden Sie den Curl-Befehl für den Standard...

Detaillierte Erklärung der Linux-CPU-Last und CPU-Auslastung

CPU-Last und CPU-Auslastung Beides kann bis zu ei...

Erste Schritte Tutorial für Anfänger⑧: Einfaches Erstellen einer Artikel-Site

In meinem letzten Beitrag habe ich darüber gesproc...

So erhöhen Sie die Ladegeschwindigkeit von HTML-Seiten

(1) Reduzieren Sie HTTP-Anfragen. (Ressourcendate...

Detaillierte Analyse der HTML-Semantik und der zugehörigen Front-End-Frameworks

Über Semantik Die Semantik ist die Lehre von der ...

So deinstallieren Sie MySQL 5.7.19 unter Linux

1. Finden Sie heraus, ob MySQL zuvor installiert ...

Anweisungen zur Verwendung der Option --rm von Docker Run

Wenn der Docker-Container beendet wird, bleibt da...