Guten Abend,
ich stehe grade vor dem Problem, eine Query nach folgendem Muster optimieren zu müssen:
Ohne das blöde Offset würde ich die Abfrage einfach auf ein UNION ALL umschreiben...
Das Problem ist aber, zuverlässig immer die richtigen Datensätze zu liefern und beim Blättern nichts zu überspringen. Das Ganze soll natürlich so performant wie möglich sein...
Normalerweise würde ich das also so (ohne Offset) machen:
Sobald ich jedoch das Offset miteinbeziehen möchte, habe ich ein Problem bei der Vorselektion der Datensätze. Es kann dann unter Umständen so sein, dass auf Seite 1 12 Datensätze mit col1 = 12 und 13 Datensätze mit col2 = 12 angezeigt werden. Auf Seite zwei sollen die natürlich übersprungen werden. Mein Problem: Ich habe dann ein variables Offset für jede der beiden Möglichkeiten, das ich vor der Query bestimmen muss -> unperformant.
Zweite Möglichkeit: jedes Mal die letzte ID der vorherigen Seite in der URL mitschleppen und dann einfach nur ein einfaches LIMIT zu machen:
Oder seh ich die einfache Lösung gerade nur nicht? Die MAX_ID-Lösung würde ich gerne vermeiden, weil es dann mein System etwas inkosistent (die Seite ist untergliedert in verschiedene Auswertungen, wovon nur einige diese Optimierung bräuchten) machen würde...
Experten vor
Greetz
paddya
ich stehe grade vor dem Problem, eine Query nach folgendem Muster optimieren zu müssen:
PHP:
SELECT foo, bar, col1, col2 FROM table INNER JOIN bla ON table.foo = bla.foo WHERE 12 IN(col1, col2) ORDER BY bar DESC LIMIT ($page-1)*25, 25
Ohne das blöde Offset würde ich die Abfrage einfach auf ein UNION ALL umschreiben...
Das Problem ist aber, zuverlässig immer die richtigen Datensätze zu liefern und beim Blättern nichts zu überspringen. Das Ganze soll natürlich so performant wie möglich sein...
Normalerweise würde ich das also so (ohne Offset) machen:
PHP:
(SELECT foo, bar, col1, col2 FROM table INNER JOIN bla ON table.foo = bla.foo WHERE col1 = 12 LIMIT 25) UNION ALL (SELECT foo, bar, col1, col2 FROM table INNER JOIN bla ON table.foo = bla.foo WHERE col2 = 12 LIMIT 25) ORDER BY bar DESC LIMIT 25
Sobald ich jedoch das Offset miteinbeziehen möchte, habe ich ein Problem bei der Vorselektion der Datensätze. Es kann dann unter Umständen so sein, dass auf Seite 1 12 Datensätze mit col1 = 12 und 13 Datensätze mit col2 = 12 angezeigt werden. Auf Seite zwei sollen die natürlich übersprungen werden. Mein Problem: Ich habe dann ein variables Offset für jede der beiden Möglichkeiten, das ich vor der Query bestimmen muss -> unperformant.
Zweite Möglichkeit: jedes Mal die letzte ID der vorherigen Seite in der URL mitschleppen und dann einfach nur ein einfaches LIMIT zu machen:
PHP:
(SELECT foo, bar, col1, col2 FROM table INNER JOIN bla ON table.foo = bla.foo WHERE col1 = 12 AND bar < MAX_ID LIMIT 25) UNION ALL (SELECT foo, bar, col1, col2 FROM table INNER JOIN bla ON table.foo = bla.foo WHERE col2 = 12 AND bar < MAX_ID LIMIT 25) ORDER BY bar DESC LIMIT 25
Oder seh ich die einfache Lösung gerade nur nicht? Die MAX_ID-Lösung würde ich gerne vermeiden, weil es dann mein System etwas inkosistent (die Seite ist untergliedert in verschiedene Auswertungen, wovon nur einige diese Optimierung bräuchten) machen würde...
Experten vor

Greetz
paddya
Zuletzt bearbeitet: