PHPGangsta - Der praktische PHP Blog

PHP Blog von PHPGangsta


Archive for the ‘Index’ tag

SQL richtig schreiben: Ausnutzung von Indizes

with 6 comments

PerformanceUm 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

Weiterlesen »

Written by Michael Kliewe

März 27th, 2013 at 10:10 am

Per Index auf einen assoziativen Array zugreifen

with 13 comments

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]];

Written by Michael Kliewe

Juli 13th, 2011 at 8:42 am

Posted in PHP

Tagged with , ,