Archive for the ‘Index’ tag
SQL richtig schreiben: Ausnutzung von Indizes
Um SQL kommt man in der heutigen Webentwicklung nicht herum, und jeder von uns kann SQL-Queries erstellen. Doch nicht jeder SQL-Query, der das korrekte Ergebnis zurückliefert, ist optimal aus Sicht der Performance. Hier ein kleines Beispiel:
Wir haben folgende Tabelle:
CREATE TABLE IF NOT EXISTS `Login` ( `LoginId` int(11) NOT NULL AUTO_INCREMENT, `UserId` int(11) NOT NULL, `LoginDateTime` datetime NOT NULL, PRIMARY KEY (`LoginId`) )
Nehmen wir an in der Tabelle sind 10.000.000 Zeilen. Es sind 10.000 verschiedene UserIds enthalten und jeder User hat im Schnitt 1.000 Logeinträge in den letzten 3 Jahren produziert. Die Tabelle enthält erstmal keine Indizes.
Die Aufgabe ist die folgende: Hole alle Logeinträge die in den letzten 30 Minuten stattgefunden haben.
Die Queries
Per Index auf einen assoziativen Array zugreifen
Hä? Was ist das denn für eine Überschrift? Das geht doch garnicht! Richtig, normalerweise geht das nicht, aber mit etwas tricksen schon.
Wir haben das folgende Array und möchten den 4. Wert haben, ohne aber den Key zu kennen. Bei einem 0-basierten Array wäre es also das Element mit dem Index 3:
<?php $array = array( '10.07.2011' => 14, '11.07.2011' => 51, '12.07.2011' => 46, '13.07.2011' => 9, '14.07.2011' => 20, '15.07.2011' => 37, ); echo $array[3];
Wie zu erwarten erhalten wir eine Notice und keinen Wert:
Notice: Undefined offset: 3 in test.php on line 12
Doch wie kommen wir nun an das 4. Array-Element? Ich habe 3 Möglichkeiten für euch, zuerst die unschönen:
$i=0; foreach ($array as $a) { if ($i == 3) { echo $a; break; } $i++; }
Bei einem großen Array ist diese Methode natürlich sehr langsam. Vergleichbar schlecht der folgende Code:
for ($i=0; $i<3; $i++) { next($array); } echo current($array);
Besser ist die folgende Lösung:
echo current(array_slice($array, 3, 1));
Wer kennt noch eine?
Edit:
Zwei weitere Lösungen aus den Kommentaren, wahrscheinlich irgendwo in der Mitte anzusiedeln was die Geschwindigkeit bei sehr großen Arrays angeht:
$values = array_values($array); echo $values[3];
Mit PHP 5.4 geht es sogar noch kürzer ohne das „Zwischenarray“:
echo array_values($array)[3];
Oder aber auch:
$keys = array_keys($array); echo $array[$keys[3]];
PHP 5.4:
echo $array[array_keys($array)[3]];