Hlavní navigace

MySQL vs PostgreSQL vs Firebird

Ján Šuňavec 25. 10. 2005

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?

25. 10. 2005 14:29

Miloslav Ponkrác (neregistrovaný)
Netvrdím, že vaše dokumentace z doby před dvěma lety není použitelná. Jako z nouze ctnost proč ne.

Formát jednoho dokumentu je praktický i při rozsáhlých projektech.

Co se týká formátu PDF tak jej považuji za formát vhodný pro tisk, ale naprosto nevhodný jako normální manuál používaný pro praxi. I když je pravda, že se setkávám v mnoha projektech (ať už komerčních, nebo free) s tendencí vydávat dokumentaci v PDF, snažím se vždy sehnat manuál v jakémkoli jiném formátu, než PDF. Skoro cokoli je…



25. 10. 2005 13:41

Pokud jste používal přímo API Firebirdu, pak je problem jasný: neuvolnil jste statement handle svých příkazů. Ukončení transakce totiž statement handle (i.e. SQL příkazy) neuvolňuje, protože se nejedná o resource transakce, ale spojení k databázi (lze je použít ve více transakcích). Firebird v tomto směru zkrátka funguje jinak než jiné databáze. Toto rozhodně není memory leak.
Měšec.cz: U levneELEKTRO.cz už reklamaci nevyřídíte

U levneELEKTRO.cz už reklamaci nevyřídíte

Podnikatel.cz: K EET. Štamgast už peníze na stole nenechá

K EET. Štamgast už peníze na stole nenechá

Lupa.cz: Proč firmy málo chrání data? Chovají se logicky

Proč firmy málo chrání data? Chovají se logicky

Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

DigiZone.cz: ČRo rozšiřuje DAB do Berouna

ČRo rozšiřuje DAB do Berouna

DigiZone.cz: NG natáčí v Praze seriál o Einsteinovi

NG natáčí v Praze seriál o Einsteinovi

Lupa.cz: Teletext je „internetem hipsterů“

Teletext je „internetem hipsterů“

Podnikatel.cz: Prodává přes internet. Kdy platí zdravotko?

Prodává přes internet. Kdy platí zdravotko?

Lupa.cz: Insolvenční řízení kvůli cookies? Vítejte v ČR

Insolvenční řízení kvůli cookies? Vítejte v ČR

DigiZone.cz: Recenze Westworld: zavraždit a...

Recenze Westworld: zavraždit a...

Vitalia.cz: 9 největších mýtů o mase

9 největších mýtů o mase

Měšec.cz: Zdravotní a sociální pojištění 2017: Připlatíte

Zdravotní a sociální pojištění 2017: Připlatíte

Vitalia.cz: Říká amoleta - a myslí palačinka

Říká amoleta - a myslí palačinka

Vitalia.cz: „Připluly“ z Německa a možná obsahují jed

„Připluly“ z Německa a možná obsahují jed

Vitalia.cz: Baletky propagují zdravotní superpostel

Baletky propagují zdravotní superpostel

Vitalia.cz: Jsou čajové sáčky toxické?

Jsou čajové sáčky toxické?

Vitalia.cz: Paštiky plné masa ho zatím neuživí

Paštiky plné masa ho zatím neuživí

DigiZone.cz: ČT má dalšího zástupce v EBU

ČT má dalšího zástupce v EBU

Podnikatel.cz: Na poslední chvíli šokuje vyjímkami v EET

Na poslední chvíli šokuje vyjímkami v EET

Vitalia.cz: Tesco: Chudá rodina si koupí levné polské kuře

Tesco: Chudá rodina si koupí levné polské kuře