Pár napja írtam bejegyzést MyISAM, InnoDB és MongoDB adatbázisokkal végzett tesztjeimről, most új mérésekről tudok beszámolni. Egyrészt a kapott visszajelzések mentén végeztem pár konfiguráció változtatást, s ennek kapcsán sikerült elérni jelentős sebességnövekedéseket, másrészt pedig bővítettem a kört, és MariaDB (Aria, MyISAM, XtraDB és PXBT motorokkal), Percona Server (MyISAM és XtraDB motorokkal) felállásokban is végeztem méréseket.

Előző alkalommal egy saját fordítású, de különböző népszerű, finomhangolásokat lehetővé tevő patcheket nem tartalmazó MySQL 5.5.9 community edition, illetve egy gyári beállításokkal indított MongoDB 1.6.5 voltak a tesztalanyok. Most egy Percona Server 5.5.8 (béta), és egy MariaDB 5.2.4 disztribúció bővítette a kört. Ezek a disztribúciók alapvetően bináris kompatibilitást ígérve alapból sokkal jobban hangolt, illetve még jobban hangolható változatát ígérik az eredeti MySQL disztribúciónak. A bináris kompatibilitás azt jelenti, hogy a diszken tárolt adatbázisunk felett konverzió elvégzése nélkül kicserélhetjük az adatbázisszervert. Ezek a gyakorlatban nagyon jól is működtek, az egyes adatbázisszerverek által előállított fájlok egy-az-egyben meg is egyeztek.
Az InnoDB-vel végzett tesztjeim kapcsán kaptam több irányból is visszajelzést, hogy ennél jobbnak kellene lennie az eredményeimnek. Alapvetően gyári beállításokkal futtattam, a konfigurációba nem nyúltam bele, emiatt erre számítottam is, de utánaolvastam a témának, és a végeredmény végül erősen meglepett, az InnoDB hozta a MyISAM sebességét. Ezen kívül a MongoDB kapcsán végeztem még el egy változtatást, miszerint egy extra paraméterrel indítottam, mely csökkentette az I/O-t, és tovább gyorsította az importálás sebességét, még szimpatikusabbá téve a MongoDB szolgáltatásait.
Először álljanak itt a friss eredmények, majd pedig írok arról, hogy pontosan milyen változtatásokat eszközöltem a konfigurációkon. Az adatok és a felállás teljesen megegyezik a korábbi bejegyzésben írottakkal, egy korrekt, más feladatot el nem látó, terhelést nem kapó szerverrel végeztem a méréseket. Az adatfájlok méretét itt nem részletezem, a korábbi bejegyzéshez képest nem változtak. A referencia sebesség, csak az XML feldolgozása továbbra is 2:28 körüli érték.
MySQL Community Server 5.5.9, saját fordítás, extra configure paraméterek nélkül
- MyISAM tábla, tömörítés nélkül: 5:32
- MyISAM tábla, PHP oldalon gzdeflate-tel: 6:17
- InnoDB tábla, tömörítés nélkül: 5:24
- InnoDB tábla, PHP oldalon gzdeflate-tel: 6:15
- InnoDB tábla, ROW_FORMAT=COMPRESSED-del: 7:56
Az InnoDB tábláknál a többi MySQL disztribúcióhoz képest a konfiguráción változtatnom kellett, nem engedett akkora logfájl méretet, mint a többi megoldás.
Percona Server 5.5.8, béta változat, bináris 64 bites Linuxos disztribúció
- MyISAM tábla, tömörítés nélkül: 4:54
- MyISAM tábla, PHP oldalon gzdeflate-tel: 6:17
- XtraDB tábla, tömörítés nélkül: 5:14
- XtraDB tábla, PHP oldalon gzdeflate-tel: 6:29
- XtraDB tábla, ROW_FORMAT=COMPRESSED-del: 8:03
Az XtraDB engine egy InnoDB fork, olyannyira, hogy a CREATE TABLE során az ENGINE megadásakor így kell rá hivatkozni.
MariaDB 5.2.4, bináris 64 bites Linuxos disztribúció
- Aria, tömörítés nélkül: 7:54
- Aria, PHP oldalon gzdeflate-tel: 8:00
- MyISAM, tömörítés nélkül: 5:31
- MyISAM, PHP oldalon gzdeflate-tel: 6:12
- XtraDB, tömörítés nélkül: 6:25
- XtraDB, PHP oldalon gzdeflate-tel: 6:16
- PXBT, tömörítés nélkül: 8:23
- PXBT, PHP oldalon gzdeflate-tel: 8:16
Az Aria engine egy MyISAM fork, komolyabb eltérésekkel, például ACID műveletekkel. A PXBT egy a PrimeBase cég által fejlesztett, szintén ACID megoldás. Az Aria és a PXBT finomhangolásának erőforrások hiányában NEM jártam utána.
MongoDB 1.6.5, bináris 64 bites Linux disztribúció
- tömörítés nélkül: 3:01
- PHP oldal gzdeflate-tel: 4:47
MongoDB 1.8.0 RC0, bináris 64 bites Linux disztribúció
- tömörítés nélkül: 3:02
- PHP oldal gzdeflate-tel: 4:46
Kipróbáltam a fejlesztői változatot is.
Optimalizációk
A MyISAM tuningolásakor a key_buffer, a key_buffer_size és thread_concurrency értékek voltak, melyek leginkább befolyásolták a sebességet. A végleges beállítások:
key_buffer = 16M
key_buffer_size = 384M
max_allowed_packet = 16M
table_open_cache = 512
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 64M
thread_stack = 192K
thread_cache_size = 8
query_cache_limit = 1M
query_cache_size = 32M
thread_concurrency = 8
Az InnoDB/XtraDB esetén a sebességben a legjelentősebb változást az alapértelmezett innodb_buffer_pool_size korrekt, illetve az innodb_log_file_size és innodb_log_buffer_size paraméterek hangolásával sikerült elérni. A rendelkezésre álló memóriához, illetve az adatbázis méretéhez képest nagyobbra állítással értem el a kedvező sebességeket. Végül az alábbi paramétereknél maradtam (az utolsó két megoldás az InnoDB ACID mivoltát torpedózza meg, ezzel sebességnövekedést elérve):
innodb_file_per_table
innodb_file_format = Barracuda
innodb_buffer_pool_size = 8G
innodb_additional_mem_pool_size = 20M
innodb_log_file_size = 2G
innodb_log_buffer_size = 512M
innodb_flush_log_at_trx_commit = 0
innodb_flush_method = O_DIRECT
A MongoDB esetében egyetlen változtatást eszközöltem, parancssorban a –syncdelay 1000 átadásával. Ez a bufferek kiírási gyakoriságát csökkentette 1000 másodpercre, mely több volt, mint az írások futási ideje.
Összefoglalás
Mint látható, a korábbi méréseimhez képest sikerült az InnoDB sebességét a MyISAM motoréhoz hasonló sebességűre hoznom, sőt, volt olyan felállás is, ahol az InnoDB-ből jobb eredményt tudtam kihozni, mint a MyISAM-ból. A Percona Server bizonyult a legjobban optimalizáltnak, hiszen ugyanazon szerverbeállításokkal a MyISAM táblákból jelentősen jobb, az InnoDB (XtraDB) táblákból pedig a többi adatbázis disztribúcióhoz képest megegyező sebességet tudott kihozni. A MongoDB-t tovább sikerült gyorsítanom, ezzel is megmutatva, hogy az egyik leggyorsabb adatbázismotorok között van, jelentősen lepipálva a MySQL szerverek lehetőségeit. A MongoDB-nél mindenképp, de a többi esetben is elmondható, hogy a sebesség eredményeket a PHP oldali adatfeldolgozás, kitömörítés nagymértékben befolyásolta, sokkal gyorsabb eredmények születtek volna, ha a betöltendő adat egyből rendelkezésre áll.
A méréseim visszahozták a bizalmam az InnoDB táblákba, illetve rámutattak arra, hogy a Percona Server disztribúcióra érdemes lehet átállnom. Ez utóbbiról más forrásokból is pozitívumokat hallottam csak, így ezt várhatóan meglépem. A mérések nem kis időmet vitték el, de az írási sebességek mellett mindenképp szeretnék még egy olvasási tesztet is elvégezni, valamennyire modellezve a végső felállást is, így úgy tűnik, hogy lesz egy harmadik rész is, mely erről fog szólni.