it-swarm.com.de

Leistungsunterschied zwischen MySQL und PostgreSQL für dasselbe Schema / dieselben Abfragen

Ich bin ein DBA-Neuling und habe Erfahrung mit Microsoft SQL Server, möchte aber zu FLOSS springen.

Ich gründe ein Unternehmen und wir entwickeln eine App (PHP) mit einem Postgres-Backend. Außerdem haben wir einige Tests im Vergleich zu MySQL durchgeführt. Wir stellen fest, dass MySQL doppelt so schnell ist wie PostgreSQL.

Ich habe einen konkreten Leistungstest durchgeführt:

  • Gleiche Spalten in der Tabelle mit entsprechenden Spaltendatentypen.
  • Gleiche Anzahl von Zeilen.
  • Gleiche Indizes in beiden (Primärschlüssel enthalten).
  • Die CPU-Auslastung ist im Leerlauf und die Postgres-Maschine ist deutlich besser.
  • Und die gleiche Abfrage (offensichtlich).

Was mache ich falsch?

P.S: Ich habe viele "Howtos" zur Leistungsoptimierung für Datenbank-Engines gelesen.
P.S (2): Wir verwenden InnoDB (eine Datei pro Tabelle) in der MySQL-Datenbank.


Hallo Mat!

Ich habe die drei häufigsten ausgewählten (und schwierigsten) Abfragen durchgeführt.

Die Frage nach der Festplatte ist sicherlich nicht die gleiche. In Postgres ist es eine SSD (fast dreimal am schnellsten).

MySQL-Cache-Daten:

+------------------------------+----------------------+
| Variable_name                | Value                |
+------------------------------+----------------------+
| binlog_cache_size            | 32768                |
| have_query_cache             | YES                  |
| key_cache_age_threshold      | 300                  |
| key_cache_block_size         | 1024                 |
| key_cache_division_limit     | 100                  |
| max_binlog_cache_size        | 18446744073709547520 |
| query_cache_limit            | 1048576              |
| query_cache_min_res_unit     | 4096                 |
| query_cache_size             | 16777216             |
| query_cache_type             | ON                   |
| query_cache_wlock_invalidate | OFF                  |
| table_definition_cache       | 256                  |
| table_open_cache             | 64                   |
| thread_cache_size            | 8                    |
+------------------------------+----------------------+

Ich weiß nicht, wie ich das in PostgreSQL sehen soll.

Danke im Voraus.

20
Javier Valencia

MySQL und PostgreSQL unterscheiden sich in Bezug auf die Leistung erheblich. InnoDB- und PostgreSQL-Tabellen sind für verschiedene Arten von Abfragen optimiert. Das Verständnis dieser Unterschiede ist wichtig, um zu verstehen, wie aus beiden eine gute Leistung erzielt werden kann.

Schauen wir uns als Beispiel den offensichtlichsten Unterschied an.

PostgreSQL vs MySQL/InnoDB-Tabellenstruktur und was dies für die Leistung bedeutet

Im Allgemeinen ist PostgreSQL bei komplexen Workloads schneller, bei einfachen Primärschlüssel-Lookups ist MySQL mit InnoDB jedoch schneller.

PostgreSQL-Tabellen sind Heap-Tabellen. Es gibt keine Option zum Erstellen einer Tabelle, die keine Heap-Tabelle ist. Der Befehl cluster schreibt einfach den nach einem angegebenen Index geordneten Heap neu. Indizes stellen dann Heap-Speicherorte für Tupel mit verschiedenen Werten bereit. Indizes können nicht in physischer Reihenfolge durchlaufen werden, sondern nur in logischer Reihenfolge, sodass sie beim sequentiellen Lesen einer Tabelle viele zufällige Datenträger-E/A aufweisen. Dies bedeutet normalerweise viele sequentielle Datenträger-E/A, da Sie eine Tabelle in physischer Reihenfolge lesen können. Sequentielle Festplatten-E/A können den Read-Ahead-Cache und einige andere Optimierungen auf Betriebssystemebene verwenden.

Dies bedeutet, dass es normalerweise schneller ist, die Seiten nur von der Festplatte zu lesen, wenn Sie einen erheblichen Teil der Datensätze oder mehrere Seiten benötigen. Andererseits erfordert eine Primärschlüssel-Suche für eine Tabelle das Schlagen des Index, das Nachschlagen des Speicherorts in der Datei, das Aufrufen der Heap-Tabelle und das Abrufen des Datensatzes. Dies bedeutet eine Anzahl von Teilen zufälliger Platten-E/A.

InnoDB verfolgt einen anderen Ansatz. Bei InnoDB ist die Tabelle ein B-Tree-Index mit den tatsächlichen Daten in der Indexnutzlast. Dies bedeutet, dass eine Primärschlüssel-Suche bereits die Daten von der Blattseite abrufen kann und daher weniger zufällige Festplatten-E/A erforderlich sind. Gleichzeitig erfordert ein Index-Scan das Durchlaufen von zwei Indizes anstelle von einem, was bedeutet, dass die Verwendung eines anderen Index als des Primärschlüssels langsamer ist und sequentielle Scans noch langsamer sind.

Diagnosen in PostgreSQL erhalten

Ich denke, Sie möchten etwas verwenden wie:

 EXPLAIN (analyse, buffers, verbose)
 [query];

Dadurch erhalten Sie den Abfrageplan, erste Schätzungen, tatsächliche Zeiten, Puffernutzung und vieles mehr.

43
Chris Travers