- Mysql: Datensätze zufällig aus großen Datenbanken auslesen
- 06.06.2011 16:02
- Crawler TSConfig für tt_news pagination
- 05.05.2010 10:38
- Vektor Grafiken nach jpg umwandeln
- 02.03.2010 15:50
- Typo3, Realurl, Indexseiten und Weiterleitungen
- 18.12.2009 16:38
Nirgendwo lernt man mehr über Datenbankdesign, Entwicklung und Performance wie bei der Arbeit mit großen Datensätzen. Nichts bietet höhere Lernkurven und größeres Frustrationspotential :-) Ein großes Thema ist immer wieder die Sortierung dieser Daten. Ich möchte hier auf einen Sonderfall eingehen, die zufällige Sortierung. Gerade wenn mehrere Skripte oder Prozesse gleichzeitig auf einer Datenbasis arbeiten, möchte man oft, dass diese zufällig Daten auslesen und z.B. aktualisieren.
Normalerweise bietet MySQL die Funktion
um die ausgelesene Ergebnismenge per Zufall zu sortieren. Gerne arbeitet man hier auch noch mit LIMIT. MySQL erstellt hierfür intern eine temporäre Tabelle und einen Indexes mit Zufallszahlen, um dann danach zu sortieren. Auch bei angegebenem LIMIT wendet MySQL dies auf die kompletten Daten an, der Rest wird dann einfach verworfen. Das macht generell ja auch Sinn, da man die Zufallswerte aus der gesamten Tabelle erhalten möchte. Das Problem: Je nach Prozessorpower ab einer fünfstelligen Datenmenge LAAAAANGSAM........
Eine Lösung, mit der ich noch bis vor kurzem gearbeitet hatte, war die per OFFSET in Kombination mit LIMIT, die ich hier gefunden habe:
Ich arbeite mit AdoDB, also denkt Euch Euren Datenbanklayer, wichtig sind hier der SQL und PHP-Code. Also, was habe ich gemacht:
Vor kurzem ist auch dieses Vorgehen an seine Grenzen gestoßen. Und zwar, weil ich von einem anderen Server auf die Datenbank zugegriffen habe. Die Abfrage selbst war zwar nach wie vor performant, es wurden aber irgendwie riesige Datenmengen übertragen. Nach einiger Recherche fand ich heraus, dass bei obrigem Vorgehen trotzdem ALLE DATEN bis zum Offset ausgelesen werden und diese dann nachträglich abgeschnitten, siehe auch hier.
Aber die Lösung lag sehr nahe, gefunden bei akinas.com, wenn auch etwas umständlich. Hier meine Lösung, die (bis dato, man weiß ja nie ;-)) super funtkioniert:
Bei der WHERE-Bedingung scheinen die Daten echt gefiltert zu werden. Thats's it!
Mein Kommentar