MYSQL VS. POSTGRESQL Antanas Končius
Apie ką kalbėsiu?
Duomenų talpinimo varikliukai (storage engines) Duomenų tipai Scalability galimybės Bendriniai skirtumai (privalumai / trūkumai) Išvados
Storage engines (MySQL 5.1) MySQL 5.1 branduolys palaiko 9 varikliukus: 1.
MyISAM
2.
InnoDB
3.
NDB Cluster
4.
MERGE
5.
MEMORY (HEAP)
6.
Ir kiti.
Pilnas sąrašas (su palaikomomis savybėmis) MySQL varikliukų: čia.
Storage engines (MySQL 6) Planuojama į branduolio palaikymą įtraukti du naujus varikliukus:
Maria (arba nebedarys, arba galimybės paaiškės vėliau – dabar nėra info) Falcon
Multi Version Concurrency Control (MVCC)
Lankstus duomenų rakinimas (locking)
Optimizuotas darbas su naujais CPU ir multithread’ingo galimybė
Pilnai ACID atitinkantis transakcijų palaikymas
Duomenų spaudimas realiu laiku
Kita
3rd party MySQL storage engines Populiariausi varikliukai:
solidDB – transakcijas palaikantis varikliukas. Skelbiama, kad praktiškai dukart greitesnis už InnoDB. Opensource’inis. NitroEDB – varikliukas, orientuotas į didelius duomenis (milijardai įrašų) ir greitį. Taikytas į realaus laiko duomenų analizę tinklo saugumo rinkoje. Komercinis. Rašytas su Modula-2 programavimo kalba. BrightHouse – varikliukas, sukurtas duomenų archyvavimui (sandėliavimui) terabaitiniais mastais didele kompresija, su mažu greičio nuostoliu ir plačiomis užklausų galimybėmis. Kompresija vidutiniškai 10:1. Pvz 30TB duomenų suspaudžia į ~3TB, ir duombazė sukasi normaliai.
Storage engines (PostgreSQL) Vienas storage engine’as - Postgres Storage System. Palaiko transakcijas, stored procedūras, trigger’ius , pilnai atitinka ACID, Multiversion Concurrency Control (MVCC), duomenų spaudimas ir t.t.
Duomenų tipai PostgreSQL:
nepalaiko unsigned integer palaiko Boolean tipą turi vartotojo apibrėžiamų duomenų tipų mechanizmą palaiko masyvus (galima pasidaryt kažką panašaus į couchDB) numatytąja reikšme gali būti betkokios f-jos (pažymėtos kaip STABLE arba IMMUTABLE) rezultatas, MySQL’e – tik NOW()
Scalability
PostgreSQL neturi integruoto replikacijos mechanizmo MySQL silpnybė – multicore ir multithread’ingo silpnas palaikymas
Istoriškai taip susiklostė, kad PostgreSQL buvo daromas taip, kad būtų nesunku scale’inti patį serverį – pridėti procesorių, padidinti thread’ų skaičių, o MySQL atvirkščiai, buvo daromas taip, kad būtų plečiamas serveris vienetais – t.y. prie cluster’io prijungiamas naujas serveris, ir duomenys tarpusavyje replikuojami.
Bendrinė info
PostgreSQL palaiko asinchroninį API, kas gali padidinti našumą <=40’čia procentų (straipsnis)
PostgreSQL nepalaiko 'INSERT IGNORE‘, 'REPLACE‘, ‘INSERT ... ON DUPLICATE UPDATE’ – visą šitą galima pasiekti apsirašant išsaugotąsias procedūras (stored procedures) arba taisykles (rule)
Subquery palaikymas pas MySQL atsirado tik neseniai, o ir greitaveikos problemos bus tvarkomos tik šeštoje versijoje
MySQL fulltext paiešką palaiko tik MyISAM tipo lentelėse, o InnoDB fulltext paieška veikia tik su trečių šalių softo pagalba – Sphinx Fulltext Search Engine, o PostgreSQL palaiko normaliai fulltext paiešką (nuo 8.3 versijos, iki tol veikė papildomo modulio pagalba).
Finišas Išvados? Anksčiau (iki mysql 5 išleidimo) pagal funkcionalumą PostgreSQL buvo akivaizdus lyderis, bet per pastaruosius metus MySQL pasivijo , ir ,kai kuriose vietose, net aplenkė. Bendrai žiūrint, out of the box atveju labiau pasižymi PostgreSQL, bet pagrindinis MySQL pranašumas yra lankstumas dėka kelių duomenų saugojimo variklių, taip parenkant būtent tai užduočiai skirtus įrankius. Jei vienas iš esminių kriterijų yra duomenų replikavimas, tai tada geriau rinktis MySQL.
Tolimesnei savišvietai
130-Cross-Compare-of-PostgreSQL-8.4,-SQLServer-2008,-MySQL-5.1 MySQL_vs_PostgreSQL Benchmark