Hlavní navigace

MySQL vs PostgreSQL vs Firebird

Ján Šuňavec

Po vydaní novej verzie PostgreSQL 8.1 beta 2 som hľadal na nete nejaké benchmarky. Všetky testy, ktoré som našiel, však väčšinou porovnávali PostgreSQL ver. 7.4, pripadne 8.0, ale nie 8.1. Tak som sa rozhodol, že porovnám novú verziu s hneď dvoma databázami. S MySQL a Firebirdom.

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

SQL test - mereni 1
Meranie 1.
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ý.

SQL test - mereni 2
Meranie 2.
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ý

SQL test - mereni 2 - vypnuty seqscan
Meranie 2. – 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.

SQL test - mereni 3
Meranie 3.
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

SQL test - mereni 4
Meranie 4.
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.

Našli jste v článku chybu?