- 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
Zur Zeit wird gefiltert nach: Programmierung
Filter zurücksetzen
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!

Es kommt häufiger vor, dass ich mir lizenzfreie Bilder kaufe, z.B. bei istockphoto.com. Dort gibt es unter anderem einige tausend sehr schicke Vektorgrafiken. Überraschenderweise musste ich feststellen, dass es nicht ganz einfach ist, an Informationen heranzukommen, wie man eine bestehende Vektorgrafik in ein Webformat (z.B. jpg) umwandelt / konvertiert. Die googlesuche nach "Vektor in jpg umwandeln" liefert fleißig "jpg in Vektor umwandeln" :-)
Deshalb hat es etwas gedauert, bis ich die Lösung hatte. Sie lautet Irfanview. Ich kenne das Programm noch aus den Anfängen von Windows, als es noch keinen ordentlichen Bildbetrachter gab, habe sie aber seit Jahren aus den Augen verloren. Nach dem Download und der Installation des Programms muss man allerdings noch die Plugins nachinstallieren, die gibts hier. Am besten direkt alle drüberinstallieren. Die Profis installieren nur das Paket mit Postscript. Dann kann man mit Irfanview die Vektorgrafik öffnen und in jedem beliebigen Format abspeichern.
Der Nachteil an dieser Methode ist, dass die Qualität der Bilder abnimmt. Das liegt, soweit ich das einschätzen kann, an Irfanview. Wenns wirklich gut werden soll, bleibt wohl nur der Kauf einer Vektorsoftware wie CorelDraw.
Vor einiger Zeit bin ich nochmal über ein richtig altes Script gestolpert. Damals haben wir für unseren Besucherzähler serverseitig die requests ausgewertet. Das war natürlich mit den ganzen Bots und Spidern, die ja auch alle "mitgezählt" wurden, ein ganz schöner Krampf, hat aber viel zum allgemeinen Verständnis der Internet-Technologien beigetragen.
Das Tracking lief natürlich auch über eine Session-ID. Damit und mit Hilfe der IP und des UserAgents haben wir ausgewertet, ob der User neu oder wiederkehrend ist. Der Server tut mir heute noch leid.
Mit dem Start der Session ist natürlich auch die ID generiert worden. Standardmäßig wird die Session ID per Cookie gespeichert. Nun ist es bei PHP der Fall, dass mit "Eröffnung" einer neuen Session die ID automatisch auch an alle weiteren abgehenden internen Links angehängt wird, da man ja nicht sicher sein kann, ob der Client überhaupt Cookies akzeptiert. Hier ist das ganz gut erklärt. Aus suchmaschinentechnischer Sicht ist das natürlich ein Problem, damals noch viel mehr als heute. Denn die Suchmaschinen konnten nicht immer so gut mit Parametern in der URL umgehen wie im Jahr 2009. Aus Suchmaschinensicht verweist die besuchte Seite bei jeder Abfrage auf andere Webseiten - und das ist schlecht. Also musste dieses automatische Anhängen auf jeden Fall verhindert werden.
OK, jetzt habe ich mehr Zeit mit der Erklärung des Problems zugebracht, als ich für die Lösung brauchen werden. Die ist nämlich folgende, zumindest für PHP:
Damit stellt man das ab. Ich glaube, wir haben damals fast 2 Tage nach einer Lösung gesucht.