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

20

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.

Javier Valencia
quelle
Entschuldigung für mein Englisch
Javier Valencia
(Ihr Englisch ist in Ordnung.) Haben Sie Belastungstests durchgeführt oder nur einzelne Fragen? Können Sie die von Ihnen verwendeten Datenbankeinstellungen anzeigen (insbesondere Cache-Größen)? (Die gleichen Festplatten in beiden Fällen nehme ich an?)
Mat
1
Können Sie die Abfrage und die Postgres Ausführungsplan mit Post explain analyze. Um das Lesen zu vereinfachen, können Sie den Plan auf explain.depesz.com
a_horse_with_no_name 30.04.13
1
Wenn Postgres auf einer SSD ausgeführt wird, müssen Sie mit ziemlicher Sicherheit postgresql.conf
einstellen
1
@JavierValencia: Wenn Sie das Problem beheben konnten, fügen Sie bitte eine Antwort hinzu, die beschreibt, was Sie getan haben, damit andere daraus lernen können. Sie können auch Ihre eigene Antwort akzeptieren, um diese Frage als gelöst zu markieren
a_horse_with_no_name

Antworten:

41

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 clusterBefehl 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:

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

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

Chris Travers
quelle
4
+1 für EXPLAIN (Analyse, Puffer, ausführlich)
Karmakaze
@ ChrisTravers danke für eine tolle Antwort! Sie sagten: "... (InnoDB) sequentielle Scans sind langsamer". Könnten Sie bitte erklären, was Sie in diesem Zusammenhang unter sequentiellen Scans verstehen?
VB_
Vielen Dank. Ich werde die Antwort ändern. "Sequentielle" Scans in InnoDB sind in indexlogischer Reihenfolge, sodass Sie mehr zufällige E / A-Vorgänge und keine Hilfe beim Read-Ahead-Caching haben.
Chris Travers
Danke für die nette Antwort. Für alle, die an den internen Postgres interessiert sind, empfehle ich diesen Beitrag: interdb.jp/pg/pgsql01.html Erklären Sie, wie Postgres Daten als Heap-Tabelle speichert.
3.