Ich bin ein DBA-Neuling und habe Erfahrung mit Microsoft SQL Server, möchte aber zu FLOSS wechseln.
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 deutlich besser.
- Und die gleiche Abfrage (offensichtlich).
Was mache ich falsch?
PS: Ich habe viele Anleitungen zur Leistungsoptimierung für Datenbank-Engines gelesen.
PS (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 so schnell).
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.
quelle
explain analyze
. Um das Lesen zu vereinfachen, können Sie den Plan auf explain.depesz.compostgresql.conf
Antworten:
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 eine gute Leistung erzielt werden kann.
Betrachten wir als Beispiel den offensichtlichsten Unterschied.
PostgreSQL vs MySQL / InnoDB-Tabellenstruktur und was dies für die Leistung bedeutet
Bei komplexen Workloads ist PostgreSQL im Allgemeinen schneller, bei einfachen Primärschlüsselsuchen ist MySQL mit InnoDB jedoch schneller.
PostgreSQL-Tabellen sind Heap-Tabellen. Es gibt keine Möglichkeit, eine Tabelle zu erstellen, die keine Heap-Tabelle ist. Der
cluster
Befehl schreibt den nach einem bestimmten Index sortierten Heap einfach neu. Indizes bieten dann Speicherorte für Tupel mit verschiedenen Werten. Indizes können nicht in physischer Reihenfolge durchlaufen werden, sondern nur in logischer Reihenfolge, sodass sie beim sequentiellen Lesen einer Tabelle in der Regel viele zufällige Datenträger-E / A-Vorgänge ausführen, 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, nur die Seiten von der Festplatte zu lesen, wenn Sie einen erheblichen Teil der Datensätze oder mehr als ein paar Seiten benötigen. Auf der anderen Seite muss für eine Primärschlüsselsuche für eine Tabelle der Index erreicht werden. Suchen Sie den Speicherort in der Datei, öffnen Sie die Heap-Tabelle und rufen Sie den Datensatz auf. Dies bedeutet eine Reihe von zufälligen Platten-E / A-Vorgängen.
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üsselsuche die Daten bereits von der Blattseite abruft und daher weniger zufällige Datenträger-E / A erforderlich sind. Zur gleichen Zeit 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 wird und sequentielle Scans noch langsamer sind.
Diagnosen in PostgreSQL erhalten
Ich denke, Sie möchten etwas verwenden wie:
Auf diese Weise erhalten Sie den Abfrageplan, erste Schätzungen, tatsächliche Zeiten, Puffernutzung und vieles mehr.
quelle