Hallo,
ich habe ein Problem mit einem Inner Join und Sortierung.
Hier schnell die Tabellen (ist vereinfacht, es geht hier nur um eine sinnbildhaftige Darstellung eines ähnlichen Problemes mit einer einfachen Datenstruktur)
Tabelle: article
- artId (int) - PRIMARY KEY
- name (varchar 250)
- date (DateTime) - INDEX
Tabelle: articleToCategory
- artId (int) - PRIMARY KEY
- catId (int)
Folgendes Problem: Ich mache folgende Abfrage
SELECT a.* from article a INNER JOIN articleToCategory b USING (artId)
ORDER BY a.date
Wie ihr seht, möchte ich alle artikel aufgelistet haben, welche irgendwie mit der articleToCategory Tabelle referenzieren.
Das funktioniert natürlich, ist aber langsam, und zwar nur wenn ich sortiere nach Datumsfeld.
Die Abfrage ohne ORDER BY date benötigt 0,0008 Sekunden, also Tipp Top.
Mache ich die Abfrage mit dem ORDER BY date benötigt diese 0,1 Sekunde - Sehr langsam. (auf einem DualCore 4400+ mit 2GB iRAM IDLE)
Da das ganze auch bei vielen Userzahlen skalieren soll ist natürlich 100 Millisekunden sehr schlecht.
Das ganze durch Explain geschleust bestätigt auch das Problem bzw. erklärt die Ursache:
1 SIMPLE article ALL artId NULL NULL NULL 22 Using temporary; Using filesort
1 SIMPLE a eq_ref PRIMARY PRIMARY 4 artId 1
Wie hier zu sehen ist, baut mySQL eine Temporäre Tabelle auf und macht einen Filesort.
Lasse ich das order by weg läuft das ganze um das 100fache schneller ab.
Jetzt die Frage: Wie kann ich dieses Query optimieren, sodass es auch mit dem Sortieren funktioniert?
Selektiere ich beispielsweise nur nach artikeln und sortiere nach datum dann verwendet mysql auch den Datums-Index für die Sorttierung.
Bsp:
select * from article order by date
Zeit: 0.0004 Sekunden
Index: date
vielen Danke für die Unterstützung,
mfg,
heinzler
PS: Die Artikel-Tabelle hat 250.000 Einträge, die artikelToCategory Tabelle hat über 18.000 Einträge.
ich habe ein Problem mit einem Inner Join und Sortierung.
Hier schnell die Tabellen (ist vereinfacht, es geht hier nur um eine sinnbildhaftige Darstellung eines ähnlichen Problemes mit einer einfachen Datenstruktur)
Tabelle: article
- artId (int) - PRIMARY KEY
- name (varchar 250)
- date (DateTime) - INDEX
Tabelle: articleToCategory
- artId (int) - PRIMARY KEY
- catId (int)
Folgendes Problem: Ich mache folgende Abfrage
SELECT a.* from article a INNER JOIN articleToCategory b USING (artId)
ORDER BY a.date
Wie ihr seht, möchte ich alle artikel aufgelistet haben, welche irgendwie mit der articleToCategory Tabelle referenzieren.
Das funktioniert natürlich, ist aber langsam, und zwar nur wenn ich sortiere nach Datumsfeld.
Die Abfrage ohne ORDER BY date benötigt 0,0008 Sekunden, also Tipp Top.
Mache ich die Abfrage mit dem ORDER BY date benötigt diese 0,1 Sekunde - Sehr langsam. (auf einem DualCore 4400+ mit 2GB iRAM IDLE)
Da das ganze auch bei vielen Userzahlen skalieren soll ist natürlich 100 Millisekunden sehr schlecht.
Das ganze durch Explain geschleust bestätigt auch das Problem bzw. erklärt die Ursache:
1 SIMPLE article ALL artId NULL NULL NULL 22 Using temporary; Using filesort
1 SIMPLE a eq_ref PRIMARY PRIMARY 4 artId 1
Wie hier zu sehen ist, baut mySQL eine Temporäre Tabelle auf und macht einen Filesort.
Lasse ich das order by weg läuft das ganze um das 100fache schneller ab.
Jetzt die Frage: Wie kann ich dieses Query optimieren, sodass es auch mit dem Sortieren funktioniert?
Selektiere ich beispielsweise nur nach artikeln und sortiere nach datum dann verwendet mysql auch den Datums-Index für die Sorttierung.
Bsp:
select * from article order by date
Zeit: 0.0004 Sekunden
Index: date
vielen Danke für die Unterstützung,
mfg,
heinzler
PS: Die Artikel-Tabelle hat 250.000 Einträge, die artikelToCategory Tabelle hat über 18.000 Einträge.