Rolf B: MySQL-Performance nach Update mindestens Faktor 10 langsamer

Beitrag lesen

Hallo Klaus1,

84ms für einen COUNT(*) klingt nach viel. War das die erste Ausführung? Oder hast Du die Abfrage mehrfach gemacht (wegen Caching)? Aber man weiß auch nicht, wie groß die Table ist und wieviele Spalten sie hat. Sind die 12086 im Explain alle Rows oder die gefundenen Rows?

Ich habe hier MariaDB 10.5.9 am Start, und habe durch Einsatz von RAND() eine Testtabelle mit knapp einer halben Million Zeilen erzeugt. Wenn der Index verwendet wird, sind die Query-Zeiten unmessbar klein. Ohne Index liegen sie bei 200ms.

Hast Du Messwerte für die gleiche Query aus der Zeit vor der Umstellung?

Die Frage von Mitleser ist auch ganz interessant: Ist erfasstam ein String oder ein Date? LIKE-Abfragen gegen ein DATE könnten in MYSQL tatsächlich möglich sein, diese DB ist dafür berüchtigt, einfach blindlings zu konvertieren statt aufwändige Konvertierungen explizit zu verlangen.

LIKE Abfragen neigen aber auch zu Table Scans, bei einer Wenn es ein DATE ist, könnte erfasstam BETWEEN '2021-07-01' AND '2021-07-31' deutlich fixer sein. Wenn es ein DATETIME ist, musst Du beim End-Datum natürlich '2021-07-31 23:59:59' oder gleich '2021-08-01' schreiben.

Und dann die Frage: Warum COUNT(*)? Geht es Dir um die Anzahl? Oder um die Frage, ob es Sätze gibt? Für die zweite Frage ist ein EXISTS (SELECT * ...) viel schneller, und wenn Du einen festen Satz von solchen Prüfungen machen musst, kannst Du sie auch in einem SELECT zusammenfassen:

SELECT EXISTS(SELECT * FROM ...) AS testa,
       EXISTS(SELECT * FROM ...) AS testb,
       EXISTS(SELECT * FROM ...) AS testc,
       EXISTS(SELECT * FROM ...) AS testd,
       EXISTS(SELECT * FROM ...) AS teste

Die größte Performancebremse ist oft nicht der Server, sondern sitzt vor der Tastatur 😉

insgesamt 120 dieser Abfragen

Ja. Hm. Wetten, dass das eleganter geht? Ich weiß zwar nicht wie, weil ich deine Aufgabenstellung nicht kenne (oder seit einer früheren Frage von Dir wieder vergessen habe), aber bei 120 COUNT(*) Abfragen muss es eine bessere Lösung geben.

Rolf

--
sumpsi - posui - obstruxi