Andreas Görtz: MySQL SQL_CALC_FOUND_ROWS verzögert gewaltig

Beitrag lesen

Hi Kalle,

SELECT
SQL_CALC_FOUND_ROWS
ort1.*
FROM      bia_orte AS ort1
ORDER BY ort1.name, ort1.name_zusatz
LIMIT 0,50

neben den von Vinzenz verlinkten Hinweisen: du sortierst hier nach zwei Spalten. Um dort einen Index nutzen zu können, benötigt MySQL einen Multiple-Column Index über beiden Spalten. Ansonsten gibt es einen Full Table Scan, den man in jedem Fall vermeiden möchte. Ich vermute, dass du nur einen Index über jeweils eine Spalte gesetzt hast!? Es wäre hilfreich, wenn du mal die Ausgabe von

SHOW CREATE TABLE bia_orte;

posten würdest. In jedem Fall lohnt es sich aber, dir die Ausgabe von EXPLAIN anzusehen:

EXPLAIN SELECT SQL_CALC_FOUND_ROWS ort1.*  
FROM bia_orte AS ort1  
ORDER BY ort1.name, ort1.name_zusatz  
LIMIT 0,50;

Wenn in der Spalte "type" der Wert "ALL" auftaucht, hast du einen Full Table Scan produziert => nicht gut. Das gleiche EXPLAIN-Ergebnis dürftest du übrigens auch ohne SQL_CALC_FOUND_ROWS erhalten; dass die Query dann trotzdem so "schnell" arbeitet, dürfte daran liegen, dass MySQL wegen der LIMIT-Angabe nach 50 gefundenen Zeilen abbricht, was es mit SQL_CALC_FOUND_ROWS nicht tut.

Gruß,
Andreas.