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

So konfigurieren Sie gängige Software unter Linux

Wenn Sie einen neuen Linux-Server bekommen, müsse...

Einführung in das Versionsverwaltungstool Rational ClearCase

Rational ClearCase ist ein Tool für das Softwarek...

border-radius-Methode zum Hinzufügen abgerundeter Ränder zu Elementen

border-radius:10px; /* Alle Ecken sind mit einem ...

MySQL 5.6.24 (binär) automatisches Installationsskript unter Linux

In diesem Artikel wird der Skriptcode für die aut...

Anfänger lernen einige HTML-Tags (2)

Verwandter Artikel: Anfänger lernen einige HTML-Ta...

Manuelle Implementierung des bidirektionalen Datenbindungsprinzips von Vue2.0

In einem Satz: Datenentführung (Object.defineProp...

Die Bedeutung des Statuscodes im HTTP-Protokoll

Ein Statuscode, der eine vorläufige Antwort anzei...

Vue verwendet die Methode in der Referenzbibliothek mit Quellcode

Der offizielle Quellcode von monaco-editor-vue la...

Einführung in die CentOS7-Firewall und portbezogene Befehle

Inhaltsverzeichnis 1. Überprüfen Sie den aktuelle...

Eine Lösung für einen Fehler in IE6 mit jquery-multiselect

Bei der Verwendung von jquery-multiselect (einem ...