Postgres 9.1 vs MySQL 5.6 InnoDB?

69

Einfache Frage - Was wäre besser für eine mittelgroße / große Datenbank mit der Anforderung an die Kompatibilität mit ACID im Jahr 2012?

Ich habe alles (gut die meisten) über mySQL vs pgSQL gelesen, aber die meisten dieser Beiträge beziehen sich auf Version 4.5.1 bzw. 7.8 und sind ziemlich veraltet (2008, 2009). Es ist jetzt fast 2012, also könnten wir versuchen, das Problem neu zu betrachten.

Grundsätzlich würde ich gerne wissen, ob es in PostgreSQL etwas gibt, das die Benutzerfreundlichkeit, Verfügbarkeit und die größere Entwickler- / Wissensbasis von MySQL übertrifft.

Ist der Abfrageoptimierer von MySQL immer noch dumm? Ist es bei sehr komplizierten Abfragen immer noch sehr langsam?

Schieß los! :) :)

PS. Und schick mich nicht zu Brille oder Wiki. Ich suche nach wenigen spezifischen Punkten, nicht nach einer Übersicht + Ich vertraue StackOverflow mehr als einer zufälligen Seite, auf der 'kluger Kerl' sein Licht erstrahlt.

Nachtrag

Projektgröße : Nehmen wir ein Bestellsystem mit ungefähr 10-100 Bestellungen / Tag pro Konto, ein paar tausend Konten, schließlich kann jedes mehrere hundert bis mehrere tausend Benutzer haben.

Besser in : zukunftssicher und flexibel sein, wenn es um wachsende und sich ändernde Anforderungen geht. Leistung ist auch wichtig, um die Kosten in der Hardwareabteilung niedrig zu halten. Auch die Verfügbarkeit qualifizierter Arbeitskräfte wäre ein Faktor.

OLTP oder OLAP : OLTP

RandomWhiteTrash
quelle
5
Sie müssten einige Dinge genauer und genauer definieren, damit eine Antwort nützlich ist. Wörter wie "besser" und "mäßig". Besser, wenn Sie Ihrem DBA Zeit zum Schlafen geben, oder besser für Ihre neuen Mitarbeiter mit einer kürzlich durchgeführten MySQL-Prüfung im Kopf? Mäßig für einen CD-Sammlungsindex oder eine Messaging-Anwendung mit 10 Millionen Benutzern? OLTP, OLAP?
Ptomli
Was ist eine mittelgroße / große Datenbank für Sie?
Hugues Van Landeghem

Antworten:

57

Ist der Abfrageoptimierer von MySQL immer noch dumm? Ist es bei sehr komplizierten Abfragen immer noch sehr langsam?

Alle Abfrageoptimierer sind manchmal dumm. PostgreSQL ist in den meisten Fällen weniger dumm. Einige der neueren SQL-Funktionen von PostgreSQL (Fensterfunktionen, rekursive WITH-Abfragen usw.) sind sehr leistungsfähig, aber wenn Sie ein dummes ORM haben, können sie möglicherweise nicht verwendet werden.

Größe des Projekts: Nehmen wir ein Bestellsystem mit ungefähr 10-100 Bestellungen / Tag pro Konto, ein paar tausend Konten, schließlich kann jedes mehrere hundert bis mehrere tausend Benutzer haben.

Klingt nicht so groß - in Reichweite einer großen Kiste.

Besser in: zukunftssicher und flexibel sein, wenn es um wachsende und sich ändernde Anforderungen geht.

PostgreSQL verfügt über ein starkes Entwicklerteam mit einer erweiterten Community von Mitwirkenden. Freigaberichtlinie sind streng und enthalten nur Bugfixes in den Punkt-Releases. Verfolgen Sie immer die neueste Version von 9.1.x für die Bugfixes.

MySQL war in der Vergangenheit etwas entspannter gegenüber Versionsnummern. Dies kann sich ändern, wenn Oracle verantwortlich ist. Ich bin mit den Richtlinien der verschiedenen Gabeln nicht vertraut.

Leistung ist auch wichtig, um die Kosten in der Hardwareabteilung niedrig zu halten.

Es würde mich wundern, wenn sich Hardware als Hauptbestandteil eines Projekts dieser Größe herausstellen würde.

Auch die Verfügbarkeit qualifizierter Arbeitskräfte wäre ein Faktor.

Das ist dein Schlüsselentscheider. Wenn Sie ein Team von erfahrenen Perl + PostgreSQL-Hackern haben, die im Leerlauf saßen, verwenden Sie das. Wenn Ihre Leute Lisp und MySQL kennen, verwenden Sie das.

OLTP oder OLAP: OLTP

PostgreSQL war schon immer stark in OLTP.

Mein persönlicher Standpunkt ist, dass die PostgreSQL-Mailingliste voller höflicher, hilfsbereiter und sachkundiger Personen ist. Sie haben direkten Kontakt zu Benutzern mit Terabyte-Datenbanken und Hackern, die wichtige Teile des Codes erstellt haben. Die Qualität des Supports ist wirklich hervorragend.

Richard Huxton
quelle
@ Richard ein weiterer Punkt Postgres Alter Abfragen laufen im Hintergrund
Ravi404
78

PostgreSQL ist in Bezug auf SQL-Funktionen viel weiter fortgeschritten.

Dinge, die MySQL noch nicht hat (und PostgreSQL hat):

  • aufschiebbare Einschränkungen

  • Einschränkungen überprüfen (MySQL 8.0. 16 hat sie hinzugefügt, MariaDB 10.2 hat sie)

  • Vollständiger äußerer Join
    MySQL verwendet stillschweigend einen inneren Join mit einigen Syntaxvarianten:
    https://rextester.com/ADME43793

  • seitliche Verbindungen

  • reguläre Ausdrücke funktionieren nicht mit UTF-8 (behoben mit MySQL 8.0 )

  • Reguläre Ausdrücke unterstützen weder Ersetzen noch Teilzeichenfolgen (eingeführt mit MySQL 8.0 ).

  • Tabellenfunktionen ( select * from my_function())

  • allgemeine Tabellenausdrücke (eingeführt mit MySQL 8.0 )

  • rekursive Abfragen (eingeführt mit MySQL 8.0 )

  • beschreibbare CTEs

  • Fensterfunktionen (eingeführt mit MySQL 8.0 )

  • funktionsbasierter Index

  • Teilindex

  • Zusätzliche Spalte in einen Index aufnehmen (z. B. für eindeutige Indizes)

  • mehrspaltige Statistiken

  • Volltextsuche in Transaktionstabellen (MySQL 5.6 unterstützt dies)

  • GIS-Funktionen für Transaktionstabellen

  • EXCEPT- oder INTERSECT-Operator (MariaDB hat sie)

  • Sie können eine temporäre Tabelle nicht zweimal in derselben select-Anweisung verwenden

  • Sie können die zu ändernde Tabelle (Aktualisieren / Löschen / Einfügen) nicht in einer Unterauswahl verwenden

  • Sie können keine Ansicht erstellen, die eine abgeleitete Tabelle verwendet (möglich seit MySQL 8.0).

      create view x as select * from (select * from y);
    
  • Lesekonsistenz auf Anweisungsebene. Wird benötigt für zB:
    update foo set x = y, y = xoder
    update foo set a = b, a = a + 100

  • Transaktions-DDL

  • DDL wird ausgelöst

  • Ausschlussbeschränkungen

  • Schlüssel- / Wertspeicher

  • Indizierung vollständiger JSON-Dokumente

  • SQL / JSON-Pfadausdrücke (seit Postgres 12)

  • Bereichstypen

  • Domänen

  • Arrays (einschließlich Indizes für Arrays)

  • Rollen (Gruppen) zum Verwalten von Benutzerrechten (MariaDB hat sie , eingeführt mit MySQL 8.0 )

  • parallele Abfragen (seit Postgres 9.6 )

  • parallele Indexerstellung (seit Postgres 11)

  • benutzerdefinierte Datentypen (einschließlich Prüfbedingungen)

  • materialisierte Ansichten

  • benutzerdefinierte Aggregate

  • benutzerdefinierte Fensterfunktionen

  • richtiger booleanDatentyp
    (die Behandlung eines Ausdrucks, der in eine Zahl ungleich Null konvertiert werden kann, als "wahr" ist kein richtiger boolescher Typ)

Wenn es um räumliche / GIS-Funktionen geht, ist Postgres mit PostGIS auch viel leistungsfähiger. Hier ist ein schöner Vergleich.

Sie sind sich nicht sicher, was Sie als "Benutzerfreundlichkeit" bezeichnen, aber es gibt mehrere moderne SQL-FunktionenIch bin , die ich nicht missen möchte (CTEs, Fensterfunktionen), die für mich "Benutzerfreundlichkeit" definieren.

Jetzt ist PostgreSQL nicht perfekt und wahrscheinlich das Unangenehmste, den gefürchteten VACUUM-Prozess für eine umfangreiche Schreibdatenbank zu optimieren.

ein Pferd ohne Name
quelle
Keine Antwort - gut zu sehen, dass ein solcher Vergleich auch beibehalten wird! Eine andere Site, die einen umfassenden aktuellen Vergleich führt, befindet sich hier - zum Zeitpunkt des Schreibens (2020/03/20) wurde sie zuletzt aktualisiert 2020/03/04).
Vérace
1
Eine, die Sie verpasst haben, und ich bin überrascht - die weit überlegene Ausgabe EXPLAIN (ANALYZE, BUFFERS) <text of SQL query>von PostgreSQL - obwohl 8.0.20 die Lücke schließen könnte!
Vérace
11

Als Ergänzung zur Antwort @a_horse_with_no_name möchte ich einige Funktionen nennen, die mir in PostgreSQL so gut gefallen:

Roman Pekar
quelle
3
Eine meiner Lieblingssachen bei Postgres ist, dass es (zum Zeitpunkt des Schreibens) (meines Wissens nach) die genaueste Implementierung des SQL-Standards in Bezug auf die Gruppierung aufweist. Sie können nicht nach Spalten gruppieren, es sei denn, sie sind in einer Aggregatfunktion oder in der Group by-Klausel enthalten oder funktional abhängig von einer Spalte, die in der group by-Klausel enthalten ist. Wenn Sie also eine Primärschlüsselspalte einer Tabelle in die group by-Klausel aufnehmen, Sie müssen nicht alle anderen Spalten in diese Tabelle aufnehmen. Beispiel auf SQL Fiddle
GarethD
@ GarethD WOW! Wusste das nicht. Jetzt wünsche ich mir, dass mein nächster Job noch PostgreSQL ist !!!
Roman Pekar
Mit MySQL können Sie dies auch tun, aber Sie können auch einfach alle Spalten weglassen, mit denen Sie sich nicht befassen. Der Wert dieser Spalten in den Ergebnissen ist undefiniert, außer in dem von Ihnen beschriebenen Fall, wie erwartet.
Rich Remer
Ja - DISTINCT ONist eine Art von MySQL GROUP BYohne sql_mode = ONLY_FULL_GROUP_BY, aber zumindest die dev / dba muss explizit darüber sein. Jetzt können Sie es in MySQL mit emulieren FIRST_VALUE()- es sollte nicht einmal eine Option geben, auf die Sie GROUP BYverzichten sollten ONLY_FULL_GROUP_BY- und so hätte es (nur) vom ersten Tag an funktionieren sollen!
Vérace
2

PostgreSQL ist eine ausgereiftere Datenbank, hat eine längere Historie, ist ANSI SQL-kompatibler und hat einen wesentlich besseren Abfrageoptimierer. MySQL verfügt über verschiedene Speicher-Engines wie MyISAM, InnoDB und In-Memory. Alle sind in dem Sinne inkompatibel, dass eine SQL-Abfrage, die auf einer Engine ausgeführt wird, bei Ausführung auf einer anderen Engine einen Syntaxfehler verursachen kann. Gespeicherte Prozeduren sind in PostgreSQL besser.

Sergey Grigoriev
quelle
Technisch gesehen hat postgresql eine längere Geschichte, aber da beide erstmals im Mai 1995 veröffentlicht wurden (laut Wikipedia), scheint dies kaum von Bedeutung zu sein. Ich würde nicht zustimmen, dass PostgreSQL ausgereifter ist, es ist eher eine Frage unterschiedlicher Designziele.
mc0e
2
@ mc0e: Das Problem ist, dass einige der ursprünglichen Designziele von mysql die wichtigsten Grundsätze hinter RDMS ignorierten.
user1071847