Podmienky testu
Ako počítač bol použitý:
Intel Celeron 2.2 GHz
768 MB RAM
20 GB Disk
MS Windows
Testované Databázy:
MySQL: 4.1.11
PostgreSQL: 8.1 beta 2
PostgreSQL: 8.0.1
Firebird: 1.5.2
Schválne nebudem uvádzať presnú hardwarovú zostavu, ide mi o porovnanie výsledkov rôznych databáz na rovnakom počítači. Čo sa týka nastavení, použil som defaultne nastavenia pri inštalácií. Na počítači som vypol všetky aplikácie a služby okrem databáz a Apache. Na testovanie som použil nasledujúcu tabuľku.
CREATE TABLE `xc_log` (
`id` int(11) default NULL,
`message` int(11) default NULL,
`logtime` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
`ip` varchar(30) collate utf8_czech_ci default NULL,
`id_user` int(11) default NULL,
`id_application` int(11) default NULL,
`id_document` int(11) default NULL
)
Do tabuľky som nalial 266266 záznamov. Na meranie som použil nasledovný PHP skript.
<?php
set_time_limit(0);
function getmicrotime(){
list($usec, $sec) = explode(" ",microtime());
return ((float)$usec + (float)$sec);
}
$time_start = getmicrotime();
$req = 'SELECT * FROM xc_log ORDER BY ip, logtime LIMIT 1 offset 100000';
/*
$ms = mysql_connect('localhost','root','jano');
mysql_select_db('factum',$ms);
mysql_query($req,$ms);
*/
/*
$ms = pg_connect("host='localhost' port='5432' user='postgres' password='postgres33' dbname='factum'");
pg_query($ms, $req);
*/
$ms = pg_connect("host='localhost' port='5431' user='postgres' password='postgres33' dbname='factum3'");
pg_query($ms,$req);
$time_end = getmicrotime();
$time = $time_end - $time_start;
echo " Build time:".round($time,4);
?>
Upravoval som len SQL, dane príkazy, podľa toho, nad ktorou databázou som chcel previesť merania. Všetky výsledky sú udávané v sekundách.
Meranie 1.
Ako prvý SQL som použil jednoduchý selekt, ale s dvojitým zoraďovaním. V tabuľkách uvádzam vždy len prve tri hodnoty z každého merania.
Jednotlive SQL príkazy pre dané databázy:
PostgreSQL: SELECT * FROM xc_log ORDER BY ip, logtime LIMIT 1 offset 100000
MySQL: SELECT * FROM xc_log ORDER BY ip, logtime LIMIT 100000, 1
Firebird: SELECT first 1 skip 100000 * FROM xc_log ORDER BY ip, logtime
PostgreSQL 8.1 | PostgreSQL 8.0.1 | MySQL | Firebird | |
Meranie 1 | 23.2871 | 26.2546 | 56.8577 | 3.6449 |
Meranie 2 | 20.1964 | 25.5028 | 61.3362 | 3.5292 |
Meranie 3 | 20.7648 | 24.0676 | 63.8045 | 3.6055 |
Hodnotenie 1.
Veľmi prijemne ma prekvapil Firebird. Bez indexov bol nameraný naozaj vynikajúci čas. Prekvapila aj MySQL, netreba sa čudovať, bez indexov je MySQL všeobecne dosť pomalá. Na grafe pekne vidno, že prvé vykonanie trvá skoro vždy najdlhšie. Ďalšia zaujímavá vec je kolísanie jednotlivých časov pri meraní MySQL. Uskutočnil som aj ďalšie merania a nameral som aj časy cez 80 sekúnd, v jednom prípade až cez 100.
Meranie 2.
Ďalšie meranie je rovnaké, len som vytvoril kombinovaný INDEX nad stĺpcami „ip“ a „logtime“. V prípade PostgreSQL bol index clusterovaný.
PostgreSQL 8.1 | PostgreSQL 8.0.1 | MySQL | Firebird | |
Meranie 1 | 10.6929 | 13.2469 | 0.9574 | 0.0305 |
Meranie 2 | 10.3848 | 13.7914 | 0.8954 | 0.0293 |
Meranie 3 | 10.4925 | 13.1472 | 0.8219 | 0.029 |
Hodnotenie 2.
MySQL sa konečne ukázala v plnom svetle. Víťaz je však s výrazným predstihom Firebird. PostgreSQL však vôbec nevyzerá dobre. Zistil som, že problém je v SQL planery, ktorý chybne zvolil sekvenčné scanovanie tabuľky, namiesto index scanu. Takže som premeral PostgreSQL ešte raz s vypnutým sekvenčným scanovaním.
Meranie 2. – PostgreSQL seqscan vypnutý
PostgreSQL 8.1 | PostgreSQL 8.0.1 | MySQL | Firebird | |
Meranie 1 | 0.341 | 0.488 | 0.9574 | 0.0305 |
Meranie 2 | 0.341 | 0.433 | 0.8954 | 0.0293 |
Meranie 3 | 0.336 | 0.441 | 0.8219 | 0.029 |
Hodnotenie 2. – PostgreSQL seqscan vypnutý
MySQL je tentokrát posledná, že by jej došiel dych?
Meranie 3.
Skutočné peklo čaká databázy až teraz. Postupne som vykonával naraz 5, 10, 15 a nakoniec 20 paralelných SQL príkazov. Spravil som mini program, ktorý naštartuje stanovený počet vláken, pričom každé vlákno zavolá náš PHP skript. V tabuľke je priemerný čas jedného vykonania.
vlákien | PostgreSQL 8.1 | PostgreSQL 8.0.1 | MySQL | Firebird |
5 | 2.2 | 3.5 | 3 | 0.6 |
10 | 5.4 | 9.4 | 5 | 0.8 |
15 | 9 | 15 | 7 | 0.9 |
20 | 11.5 | 21.1 | 9 | 1 |
Hodnotenie 3.
MySQL podala tradične veľmi dobrý, vyrovnaný výkon. PostgreSQL chvíľu sekundoval MySQL, ale potom stratil dych. No výkonová špička je zdá sa Firebird, ktorý podáva naozaj vynikajúce výsledky.
Meranie 4.
Tento test prevetrá prepojovanie medzi tabuľkami. Vytvoril som ďalšiu tabuľku, ktorá je rovnaká ako predošlá. Použil som tieto SQL:
MySQL: SELECT * FROM xc_log a, xc_log_sec b WHERE a.ip=b.ip AND a.logtime=b.logtime ORDER BY a.ip, a.logtime LIMIT 100000,1
PostgreSQL: SET enable_seqscan = off; SELECT * FROM xc_log a, xc_log_sec b WHERE a.ip=b.ip AND a.logtime = b.logtime ORDER BY a.ip, a.logtime LIMIT 1 offset 100000
Firebird: SELECT first 1 skip 100000 * FROM xc_log a, xc_log_sec b WHERE a.ip=b.ip AND a.logtime = b.logtime ORDER BY a.ip, a.logtime
vlákien | PostgreSQL 8.1 | PostgreSQL 8.0.1 | MySQL | Firebird |
1 | 1.7 | 4.3 | 6.7 | 0.1 |
5 | 20.4 | 42.5 | 19.7 | 0.6 |
10 | 44.3 | 90.3 | 36.3 | 0.7 |
15 | 65.6 | 136 | 59 | 0.9 |
20 | 86 | 181.2 | 66.8 | 2.4 |
Hodnotenie 4.
MySQL vykonáva jednotlive SQL akoby za sebou. To znamená, že prvý výsledok som dostal povedzme po 6 sekundách a posledný po 90.
PostgreSQL vykonáva všetky akoby zaraz, rozdiely medzi jednotlivými SQL boli v milisekundách. Neviem, čo si myslieť o Firebird-e, zdá sa, že je to fakt super rýchla databáza.
Záver
MySQL: Trochu slabé výsledky bez indexov. S indexami si vedie veľmi dorbe. Celkovo je to bezproblémová databáza.
Firebird: Pre mňa osobne prijemne prekvapenie. Pôvodne som očakával, že MySQL bude vo všetkých testoch prvá a ostatne databázy jej budu len sekundovať. Jediný problém bol import, ktorý zabral viac ako 30 minút. Ostatným databázam na to stačilo menej ako 5. Tiež bol problém nájsť nejaký free nástroj na jej manažovanie. Takisto LIMIT klauzula ma trochu inú syntax.
PostgreSQL: PostgreSQL 8.0.1 bola prvá verzia, ktorá „natívne“ bežala na windows. Prejavilo sa to hlavne na slabšom výkone oproti 8.1. Škoda toho problému s planerom.
Je mi jasne, že všetky databázy sa dali ešte optimalizovať rôznymi nastaveniami. Nebolo to však cieľom testu. Myslím, že za víťazstvom Firebird-u stoji aj to, že je natívne vyvíjaný pre MS Windows.
Existuje už aj verzia pre Linux. MySQL a PostgreSQL majú natívne prostredie Linux. Je mi jasne, že na Linuxe by výsledky vyzerali trochu inak.