'select * from ALargeTable' wird in MySQL sehr langsam ausgeführt
Ich habe eine Tabelle 'Preise':
CREATE TABLE `prices` (
`dt` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`buy` double NOT NULL,
`sell` double NOT NULL,
PRIMARY KEY (`dt`),
UNIQUE KEY `idx_dt_buy_sell` (`dt`,`buy`,`sell`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
mit etwa 22 Millionen Zeilen.
eine einfache Abfrage
select * from prices;
Die Ausführung dauert ca. 1 Minute.
Was macht MySQL für 1 Minute? Welche Datenstrukturen werden erstellt? Gibt es eine Möglichkeit, dies zu optimieren?
Zum Beispiel eine Abfrage
select * from prices limit 10;
wird sofort in 0,00 Sekunden ausgeführt.
Ich habe ein bisschen mit der Transaktionsisolationsstufe gespielt, mit Befehlen wie
set SESSION transaction isolation level Read committed;
SELECT @@transaction_ISOLATION;
aber ohne Erfolg.
Die MySQL-Version ist 5.7.30
Antworten
Was ist los ? Der MYSQL-Server liest Daten von Ihrer Festplatte, lädt sie in den Speicher (falls sie noch nicht im Speicher vorhanden sind) und sendet sie an den MYSQL-Client, der sie im Speicher speichert, bevor er sie an den Benutzer (Sie) auffordert.
Welche Datenstrukturen werden erstellt? Ich weiß es nicht, aber ich bin mir nicht sicher, ob es wirklich wichtig ist.
Gibt es eine Möglichkeit, dies zu optimieren? Ja, lesen Sie weniger Daten oder überprüfen Sie Ihre Konfiguration und Ihre Hardware (und wenn Sie Probleme mit der Parallelität haben, müssen Sie möglicherweise die Engine ändern).
- Lesen Sie weniger Daten: Wie Sie gesehen haben, müssen Sie bei einer
limit 10schnellen Abfrage möglicherweise nicht für jede Abfrage 22 Millionen zurückgegeben werden, und Sie können eineWHEREKlausel hinzufügen . - Überprüfen Sie Ihre Hardware: Die Daten befinden sich auf der Festplatte. Stellen Sie sicher, dass Sie eine schnelle Festplatte (wie eine SSD) haben. Stellen Sie außerdem sicher, dass auf dem Server genügend Speicher vorhanden ist
- Überprüfen Sie Ihre Konfiguration: Im Internet gibt es bessere Antworten, die erklären, wie Sie Ihre Konfiguration optimieren. Kurz (und ungenau) möchten Sie, dass alle Ihre Daten im Speicher gespeichert werden können, wenn Sie nur Daten lesen würde raten, diese Antwort zu betrachten: https://dba.stackexchange.com/a/136409/119372: Erhöhen Sie
key_buffer_sizeIhren Index, um ihn an die Größe Ihres Index anzupassen, falls dies noch nicht geschehen ist, und probieren Sie die anderen Vorschläge nacheinander aus, um festzustellen, ob sich einige oder alle auf Ihre Leistung auswirken - Informationen zur Parallelität: Ich vermute, dass diese Tabelle schreibgeschützt war. Wenn Sie die Daten einfügen / aktualisieren, während Sie sie abfragen, führt MyIsam eine Tabellensperre durch, sodass Sie InnoDB versuchen können, diese Tabellensperre zu vermeiden
Nebenbei bemerkt, wie @Barmar gezeigt hat, testen Sie den Server und den Client gleichzeitig, und Sie sagen nicht, ob beide auf demselben Server ausgeführt werden. Höchstwahrscheinlich sind Sie es, sodass der Speicher von Ihrem MYSQL-Server und Ihrem MYSQL-Client belegt werden kann.