Was Postgresql nicht bietet sind Geschwindigkeitsvorteile - eher Nachteile.
Wer auf Webtechniken basierende Anwendungen schreibt der sollte auch mal unter diesen Bedingungen testen was das eine oder andere System da so abliefert.
Die meisten Test sind schnöde PHP Scripte die einfach einen Schleifendurchlauf machen und man danach die Auswertungen betreibt.
In der Realität hat man eine Anzahl X User die mehr oder weniger heftige DB Aktionen auslösen.
Es bietet sich also an mit einem Programm wie Siege mal ein Script durchlaufen zu lassen.
Genau das habe ich mal gemacht - ein Script das via PDO die DB anspricht und exakt einen Schleifendurchlauf von 1000 INSERT's durchführt.
Und das sind die Ergebnisse (32 GB Server - System und DB Daten auf SSD):
Tabelle Mysql Format
CREATE TABLE IF NOT EXISTS `cms_additional_htmlblob_users` (
`additional_htmlblob_users_id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) DEFAULT NULL,
`htmlblob_id` int(11) DEFAULT NULL,
PRIMARY KEY (`additional_htmlblob_users_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1192001 ;
Tabelle im Postgresql Format analog.
DB Ansprache über PDO - Scripte daher bis auf DNS identisch.
PHP Version 5.5.0-1~dotdeb.1
A: Postgresql Version 9.1.9
1. truncate der tabelle
2. siege test ohne Transaktionen
siege -b -c100 --time=1M http://localhost/pgtest/index.php
** SIEGE 3.0.1
** Preparing 100 concurrent users for battle.
The server is now under siege...
Lifting the server siege.. done.
Transactions: 1649 hits
Availability: 100.00 %
Elapsed time: 59.75 secs
Data transferred: 0.13 MB
Response time: 3.35 secs
Transaction rate: 27.60 trans/sec
Throughput: 0.00 MB/sec
Concurrency: 92.50
Successful transactions: 1649
Failed transactions: 0
Longest transaction: 15.25
Shortest transaction: 0.00
Statt 1.649.000 Datensätze sind nur 602000 vorhanden - Verlust 63,5 %
3. truncate der tabelle
4. siege test mit Transaktionen
siege -b -c100 --time=1M http://localhost/pgtest/index.php
** SIEGE 3.0.1
** Preparing 100 concurrent users for battle.
The server is now under siege...
Lifting the server siege.. done.
Transactions: 1401 hits
Availability: 100.00 %
Elapsed time: 59.10 secs
Data transferred: 0.09 MB
Response time: 3.85 secs
Transaction rate: 23.71 trans/sec
Throughput: 0.00 MB/sec
Concurrency: 91.16
Successful transactions: 1401
Failed transactions: 0
Longest transaction: 12.89
Shortest transaction: 0.00
Statt 1.401.000 Datensätze sind nur 681.000 vorhanden - Verlust 51.39 %
B. Mysql - Server Version: 5.5.31-0ubuntu0.13.04.1 - (Ubuntu)
5. truncate der Mysql Tabelle
6. siege test ohne transaktionen
siege -b -c100 --time=1M http://localhost/pgtest/index2.php
** SIEGE 3.0.1
** Preparing 100 concurrent users for battle.
The server is now under siege...
Lifting the server siege.. done.
Transactions: 1092 hits
Availability: 100.00 %
Elapsed time: 59.74 secs
Data transferred: 0.00 MB
Response time: 5.26 secs
Transaction rate: 18.28 trans/sec
Throughput: 0.00 MB/sec
Concurrency: 96.06
Successful transactions: 1092
Failed transactions: 0
Longest transaction: 10.52
Shortest transaction: 1.29
Statt 1.092.000 sind 1.192.000 Datensätze vorhanden.
Das sind die Ungenauigkeiten wegen des zeitlichen Abbruchs durch Siege.
Erwartungen also voll erfüllt.
7. truncate der Mysql Tabelle
8. siege test mit transaktionen
siege -b -c100 --time=1M http://localhost/pgtest/index2.php
** SIEGE 3.0.1
** Preparing 100 concurrent users for battle.
The server is now under siege...
Lifting the server siege.. done.
Transactions: 1999 hits
Availability: 100.00 %
Elapsed time: 59.51 secs
Data transferred: 0.00 MB
Response time: 2.90 secs
Transaction rate: 33.59 trans/sec
Throughput: 0.00 MB/sec
Concurrency: 97.36
Successful transactions: 1999
Failed transactions: 0
Longest transaction: 5.60
Shortest transaction: 0.18
Statt 1.999.000 Datensätze sind 2.099.000 vorhanden.
Das sind die Ungenauigkeiten wegen des zeitlichen Abbruchs durch Siege.
Erwartungen also voll erfüllt.
Tatsächlich leistet Mysql mehr als das 3 Fache .
Und das gilt auch bei einfachen Select.
Bei einem Select Vergleich mit Mysql 5.6.x möglichen read only Transactions wird der Abstand nahezu uneinholbar.
Auch wenn Postgresql in Bereichen das besser DB System ist kann man bezüglich Speedanwendungen z.Z. nur Mysql empfehlen.
Man kann solche Test's auch mit erheblich komplexeren Tabellen und Abfragen machen - die Relation aber bleibt die Gleiche.
-----------
Klar ist - Anwendungen die keine Transaktionen einsetzen verlieren nicht nur an Sicherheit sondern auch erheblich an Speed.
Endanwender von Applikationen mit hoch dynamischen Betrieb sollten auf keinen Fall solche einsetzen die Transaktionen nicht verwenden - die vollständige Strukturzerstörung der DB ist da nur eine Frage der Zeit.
Keine Kommentare:
Kommentar veröffentlichen