Digicted

Tellen in SQL of PHP: wat is sneller?

Afgelopen zondag plaatste Nick een blogpost over MySQL en de fouten die hij mensen hier mee ziet maken.

In de reacties kwam er toen even een discussie of je COUNT() in je query moest gebruiken of een mysql_num_rows in je PHP-code als je het aantal rijen wilt weten.

Ik heb toen even een heel simpel scriptje gedraaid om gewoon snel te checken of mijn stelling klopte en inderdaad: COUNT() leek sneller te zijn.

Gisteren heb ik toen met een database met 1 miljoen rijen (testdata) een paar keer een script gedraaid en de resultaten opgeslagen in een database. Het testsysteem is een Intel PentiumD 930 met 2GB geheugen. PHP 5 en MySQL 5, draaiend op Windows Vista.

Eerst draaide ik het script op de MacBook Pro (wat voor de nodige load zorgde), maar toen bedacht ik me dat de PHP dan werd uitgevoerd op de laptop, terwijl ik de MySQL-server op de Windows-PC draaide. Totaal geen eerlijke vergelijking dus, dus verplaatst.

Het script haalt 1.000.000 rijen op uit een tabel met twee velden: id en name. ID is de primary key met een auto_increment en name is een tinytext-veld met willekeurige strings van willekeurige lengte. Na het ophalen worden de rijen geteld.

De resultaten (in seconden) zijn uiteindelijk als volgt:

PHP SQL
5866.500 503.085
1813.99 1237.07
917.166 490.60
476.952 442.147
562.155 459.487

Gemiddeld duurt het dus 626.47846069336 seconden om het aantal rijen te tellen in MySQL. In PHP duurt het gemiddeld 1927.3516174316 seconden.

De snelste run in PHP duurde 476.952 seconden, de snelste in SQL duurde slechts 442.147 seconden.

De traagste was voor PHP 5866.5 seconden en voor MySQL 1237.07 seconden.

Uit deze getallen kunnen we concluderen dat een COUNT() in MySQL sneller is dan mysql_num_rows() in PHP.

Echter zijn er nadelen verbonden aan het gebruik van COUNT(). Zo heb je waarschijnlijk meer code nodig wat niet altijd even goed is voor de leesbaarheid. Ook in gevallen dat je mogelijk geen rijen terugkrijgt kun je dit vaak niet gebruiken.

Is je applicatie echt zo performance-kritisch en heb je een grote dataset, kan dit dus iets zijn om naar te kijken. Maar in het algemeen zou ik gewoon mysql_num_rows (of een dergelijk alternatief) aanraden.

Ten slotte: voor de geïnteresseerden is alles wat ik gebruikt hebt gewoon beschikbaar. De source van mijn benchmarkscript (met een kleine wijziging naar aanleiding van een tip van Daan) en de SQL voor de tabel met de statistieken De dataset wil ik op aanvraag sturen naar mensen die de SQL-file willen hebben.

3 reacties to “Tellen in SQL of PHP: wat is sneller?”

  1. Redstar:

    Interessant stukje! Kan er eigenlijk niet meer aan toevoegen.

  2. Zain:

    K’heb geloof ik flink wat teweeg gebracht met dat blogitem :P
    Het is natuurlijk ook wel leuk om te weten wat nu precies sneller is en wat niet. Like I said, ik moet dringend eens een db’tje vol gooien met dummy records.

  3. Martijn Engler:

    @Redstar: Bedankt! :)
    @Zain: Je krijgt de SQL-file straks.

Reageer