MYSQL Sorting for group beschleunigen
Fitzroy
- datenbank
0 Sven Rautenberg0 Fitzroy0 Sven Rautenberg
0 Vinzenz Mai
Hallo,
ich habe gerade einmal mit phpmyadmin meine MYSQL Abfrage gemessen und bekam folgende Messergebenisse:
starting 0.000095
Opening tables 0.000015
System lock 0.000004
Table lock 0.000011
init 0.000039
optimizing 0.000058
statistics 0.000056
preparing 0.000027
Creating tmp table 0.000095
Sorting for group 1.934971
executing 0.000004
Copying to tmp table 0.023405
Sorting result 0.000022
Sending data 0.000050
end 0.000002
removing tmp table 0.000008
end 0.000003
query end 0.000003
freeing items 0.000062
logging slow query 0.000001
cleaning up 0.000004
ich erkenne hieraus das die Group Funktion den Flaschenhals darstellt. Gibt es eine Möglichkeit diese Funktion speziell zu unterstützen? Irgendwelche extra indexe anlegen?
Moin!
ich erkenne hieraus das die Group Funktion den Flaschenhals darstellt. Gibt es eine Möglichkeit diese Funktion speziell zu unterstützen? Irgendwelche extra indexe anlegen?
Was sagt EXPLAIN?
- Sven Rautenberg
Was sagt EXPLAIN?
id = 1
select_type = simple
table = daten
type = all
possible_keys = NULL
key = NULL
key_len = NULL
ref = NULL
rows = 344498
Extra = Using where; Using temporary; Using filesort
Moin!
Was sagt EXPLAIN?
id = 1
select_type = simple
table = daten
type = all
possible_keys = NULL
key = NULL
key_len = NULL
ref = NULL
rows = 344498
Extra = Using where; Using temporary; Using filesort
Du brauchst keine Extra-Indexe anlegen. Es würde reichen, wenn du überhaupt mal irgendeinen Index anlegst. Vernünftigerweise auf relevante Spalten, die im Query benutzt werden.
- Sven Rautenberg
Hallo,
Du brauchst keine Extra-Indexe anlegen. Es würde reichen, wenn du überhaupt mal irgendeinen Index anlegst. Vernünftigerweise auf relevante Spalten, die im Query benutzt werden.
ich habe einen Index der genau über diese Spalten geht, zusätzlich habe ich nun einen Index über "ALLE" Spalten in der Tabelle generiert, aber trotzdem steht bei possible_keys = NULL.
Ich hatte bereits vermutet das ich da einen Fehler beim Anlegen gemacht habe, aber über phpmyadmin unter Struktur -> Details ist er über alle Tabellen sichtbar.
Ich habe zwei indexe:
1. Primary für die ID
2. Alles indem alle Tabellen vorhanden sind
3. ziel hier sind alle abgefragten Spalten.
Hallo,
Hi,Ho,
ich habe einen Index der genau über diese Spalten geht, zusätzlich habe ich nun einen Index über "ALLE" Spalten in der Tabelle generiert, aber trotzdem steht bei possible_keys = NULL.
Wie sieht denn die Abfrage aus? Wäre interessant zu wissen, welche Tabellen beteiligt sind und was für einen Join Du machst?
possible_keys wird für immer NULL bleiben, wenn Du nicht JOINst, sofern ich mySQL EXPLAIN da richtig interpretiere.
Gruß, Markus**
Wie sieht denn die Abfrage aus? Wäre interessant zu wissen, welche tabellen beteiligt sind und was für einen Join Du machst?
possible_keys wird für immer NULL bleiben, wenn Du nicht JOINst, sofern ich mySQL EXPLAIN da richtig interpretiere.Gruß, Markus**
Hallo Markus,
es ist nur eine Tabelle beteiligt also kein Join. Mein Select sieht wie folgend aus:
SELECT * FROM `daten` WHERE 1_min <=60 AND 1_max >=60 AND 2_min <=30 AND 2_max >=30 AND 3_min <=15 AND 3_max >=15 AND 4_min <=60 AND 5_max >=60 GROUP by produkt_id ORDER BY preis ASC
Hallo,
es ist nur eine Tabelle beteiligt also kein Join. Mein Select sieht wie folgend aus:
SELECT * FROM
daten
WHERE 1_min <=60 AND 1_max >=60 AND 2_min <=30 AND 2_max >=30 AND 3_min <=15 AND 3_max >=15 AND 4_min <=60 AND 5_max >=60 GROUP by produkt_id ORDER BY preis ASC
und was erhoffst Du Dir für Daten?
Solch ein Statement wird von jedem mir bekannten Datenbankmanagement außer MySQL als fehlerhaft zurückgewiesen. Standard-SQL verlangt, dass nach jeder Spalte, auf die keine Aggregatsfunktion angewandt wird, gruppiert wird. MySQL hat hier eine Optimierung eingebaut, die in dem Fall greift, dass die Daten innerhalb der Gruppierung in nicht aggregierten Spalten gleich sind. Dann und sinnvollerweise \*nur dann\* kann man in MySQL diese Spalte aus der Liste der GROUP-BY-Klausel weglassen.
Sind alle Daten in anderen Spalten als produkt\_id für jede produkt\_id gleich? Wenn ja, dann ok. Wenn nein, warum fragst Du sie überhaupt ab, da Du eh unvorhersagbare Werte in diesen Spalten bekommst.
Weitere Fragen:
Gibt es einen Index für die Spalte produkt\_id?
Gibt es einen Index für die Spalte preis?
Noch ein Lesetipp: [Optimizing Queries with EXPLAIN](http://dev.mysql.com/doc/refman/5.0/en/using-explain.html).
Freundliche Grüße
Vinzenz
Hallo Fitzroy,
ich habe gerade einmal mit phpmyadmin meine MYSQL Abfrage gemessen
ich erkenne hieraus das die Group Funktion den Flaschenhals darstellt. Gibt es eine Möglichkeit diese Funktion speziell zu unterstützen? Irgendwelche extra indexe anlegen?
das MySQL-Handbuch hat ein eigenes Kapitel über Optimierung.
Freundliche Grüße
Vinzenz