Hallo,
ich muss sagen, ich bin nicht der SQL Held. Aber ich brauche Eure Hilfe. Denn die folgende Abfrage benötigt ca. eine halbe Sekunde - ZU LANGE!
Das mag zum einen an meinem "Trabbi"-Server liegen, zum anderen sicher aber auch an dieser UNION-Geschichte. Die Abfrage sieht so aus:
Alles anzeigen
Eindeutig ist diese Riesenabfrage Grund für die schlechte Performance. Wie kann ich das besser machen? Warum ich das so mache?
Meine Datensätze haben ein Feld, das anzeigt, zu welcher Quelle sie gehören (field9). Das andere zeigt an, zu welcher Kategorie sie gehören (field10).
field3 ist eine punkteskala (schönheit).
es ist bereits berechnet, wie viele Datensätze pro Quelle/Kategorie-Kombination ausgegeben werden sollen.
Ich will also mir für alle field9 und alle field10 eine vorbestimmte Anzahl von Datensätze ausgeben lassen
Deshalb kommt für jedes SELECT ein anderes LIMIT zustande. Deshalb kette ich die SELECTS mit UNIONS aneinander. Macht das Sinn? Wahrscheinlich nicht!
Wie geht es anders/besser?
Grüße und Dank,
EHW
ich muss sagen, ich bin nicht der SQL Held. Aber ich brauche Eure Hilfe. Denn die folgende Abfrage benötigt ca. eine halbe Sekunde - ZU LANGE!
Das mag zum einen an meinem "Trabbi"-Server liegen, zum anderen sicher aber auch an dieser UNION-Geschichte. Die Abfrage sieht so aus:
Quellcode
- (SELECT field1,field2,field3,field4,field5,field6,field7,field8,field9,field10 FROM table WHERE (`field7` <= '2011-09-15 01:54:00' AND `field7` > '2011-09-14 13:13:00' AND (TIMEDIFF(field7, field8) < '12:00:00')) AND field9=1 AND field10 LIKE 'aaa%' ORDER BY score DESC LIMIT 5)
- UNION
- ... für field9 = 1 von field10 like 'aaa%' bis 'ggg%' (also 7 mal)...
- UNION
- (SELECT field1,field2,field3,field4,field5,field6,field7,field8,field9,field10 FROM table WHERE (`field7` <= '2011-09-15 01:54:00' AND `field7` > '2011-09-14 13:13:00' AND (TIMEDIFF(field7, field8) < '12:00:00')) AND field9=1 AND field10 LIKE 'hhh%' ORDER BY score DESC LIMIT 2)
- UNION
- ... diesen ganzen block NOCHMAL mit field9 = 2,3,4,...,11 wiederholt ...
- UNION
- (SELECT field1,field2,field3,field4,field5,field6,field7,field8,field9,field10 FROM table WHERE (`field7` <= '2011-09-15 01:54:00' AND `field7` > '2011-09-14 13:13:00' AND (TIMEDIFF(field7, field8) < '12:00:00')) AND field9=11 AND field10 LIKE 'aaa%' ORDER BY score DESC LIMIT 4)
- UNION
- ... für field9 = 2,...,11 von field10 like 'aaa%' bis 'ggg%'...
- UNION
- (SELECT field1,field2,field3,field4,field5,field6,field7,field8,field9,field10 FROM table WHERE (`field7` <= '2011-09-15 01:54:00' AND `field7` > '2011-09-14 13:13:00' AND (TIMEDIFF(field7, field8) < '12:00:00')) AND field9=11 AND field10 LIKE 'hhh%' ORDER BY score DESC LIMIT 1)
- ORDER BY `field3` DESC //und dann noch sortiert
Eindeutig ist diese Riesenabfrage Grund für die schlechte Performance. Wie kann ich das besser machen? Warum ich das so mache?
Meine Datensätze haben ein Feld, das anzeigt, zu welcher Quelle sie gehören (field9). Das andere zeigt an, zu welcher Kategorie sie gehören (field10).
field3 ist eine punkteskala (schönheit).
es ist bereits berechnet, wie viele Datensätze pro Quelle/Kategorie-Kombination ausgegeben werden sollen.
Ich will also mir für alle field9 und alle field10 eine vorbestimmte Anzahl von Datensätze ausgeben lassen
Deshalb kommt für jedes SELECT ein anderes LIMIT zustande. Deshalb kette ich die SELECTS mit UNIONS aneinander. Macht das Sinn? Wahrscheinlich nicht!
Wie geht es anders/besser?
Grüße und Dank,
EHW