Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Die Verarbeitung einer großen Anzahl von Datenbankeinträgen mit Paging verlangsamt sich mit der Zeit

Folgendes habe ich getan und die Gesamtausführungszeit um den Faktor 10 reduziert.

Was ich aus dem Ausführungsplan meiner ursprünglichen Abfrage erkannte, war, dass es filesort zum Sortieren aller Ergebnisse verwendete und die Indizes ignorierte. Das ist ein bisschen verschwendet.

Meine Testdatenbank:5 M Datensätze, 20 GB Größe. Tabellenstruktur wie in der Frage

Anstatt blobCol direkt in der ersten Abfrage zu erhalten, erhalte ich zuerst den Wert von „Name“ für den Beginn jeder Seite. Führen Sie diese Abfrage unbegrenzt aus, bis sie 0 Ergebnisse zurückgibt. Füge das Ergebnis jedes Mal einer Liste hinzu

SELECT name
FROM my_table
where id = <anyId> // I use the id column for partitioning so I need this here
order by name
limit <pageSize * pageNumber>, 1

Die Sinusseitennummer ist zuvor nicht bekannt, beginnen Sie mit dem Wert 0 und erhöhen Sie sie weiter, bis die Abfrage null zurückgibt. Sie können auch eine Auswahlzählung (*) durchführen, aber das selbst kann lange dauern und hilft nicht, irgendetwas zu optimieren. Jede Abfrage dauerte etwa 2 Sekunden, sobald die Seitenzahl ~60 überschritten hatte.

Für mich war die Seitengröße 5000, also bekam ich eine Liste von 'Name'-Strings an Position 0, 5001, 10001, 15001 und so weiter. Es stellte sich heraus, dass die Anzahl der Seiten 1000 betrug, und das Speichern einer Liste mit 1000 Ergebnissen im Speicher ist nicht teuer.

Durchlaufen Sie nun die Liste und führen Sie diese Abfrage aus

SELECT blobCol
FROM my_table
where name >= <pageHeader>
and name < <nextPageHeader>
and city="<any string>"
and id= 1

Dies wird N Mal ausgeführt, wobei N =Größe der zuvor erhaltenen Liste ist. Da 'name' die Primärschlüsselspalte ist und 'city' ebenfalls indiziert ist, zeigt EXPLAIN, dass diese Berechnung im Speicher unter Verwendung des Indexes durchgeführt wird.

Jetzt dauert jede Abfrage 1 Sekunde statt der ursprünglichen 30-40. Wenn man also die Vorverarbeitungszeit von 2 Sekunden pro Seite kombiniert, beträgt die Gesamtzeit pro Seite 3–4 Sekunden statt 30–40.

Wenn jemand eine bessere Lösung hat oder etwas offensichtlich falsch mit dieser ist, lassen Sie es mich bitte wissen