2015-09-24 6 views
5

Ich muss damit beginnen, dass ich keineswegs ein Datenbankexperte bin. Ich weiß, wie ich Programmieranwendungen in mehreren Sprachen erlerne, die Datenbank-Backends erfordern, und bin relativ vertraut mit MySQL, Microsoft SQL Server und jetzt MEMSQL - aber wiederum kein Experte für Datenbanken, daher wird Ihr Input sehr geschätzt.MEMSQL vs. MySQL

Ich habe an der Entwicklung einer Anwendung gearbeitet, die verschiedene Tabellen referenzieren muss. Ein sehr einfaches Beispiel für ein Problem, das ich vor kurzem hatte, ist, ich habe zu:

  1. Auf einer täglichen Basis, Pull-Down-600K bis 1M Datensätze in eine temporäre Tabelle.
  2. Vergleichen Sie, was sich zwischen diesem neuen Daten-Pull und dem alten geändert hat. Notieren Sie diese Informationen in einer separaten Tabelle.
  3. Reparieren Sie die Tabelle mit den neuen Datensätzen.

Lauf # 2 ist eine Abfrage wie:

SELECT * FROM (NEW TABLE) LEFT JOIN (OLD TABLE) ON (JOINED FIELD) WHERE (OLD TABLE.FIELD) IS NULL 

In diesem Fall bin ich die beiden Tabellen auf einem bestimmten Feld zu vergleichen und dann die Informationen des Ziehens, was sich geändert hat.

In MySQL (v5.6.26, x64), meine Abfrage Timeout. Ich verwende 4 vCPUs und 8 GB RAM, aber beachte, dass der Rest meiner Konfiguration die Standardkonfiguration ist (habe keine Parameter verändert).

In MEMSQL (v5.5.8, x64), meine Abfrage läuft in etwa 3 Sekunden auf den ersten Versuch. Ich führe genau die gleiche virtuelle Serverkonfiguration mit 4 vCPUs und 8 GB RAM aus, beachte auch, dass der Rest meiner Konfiguration die Standardkonfiguration ist (habe keine Parameter verändert).

Auch in MEMSQL, ich führe eine Einzel-Knoten-Konfiguration. Das Gleiche gilt für MySQL.

Ich liebe die Tatsache, dass die Verwendung von MEMSQL mir erlaubt, mein Projekt weiter zu entwickeln, und ich stoße auf noch größere Kreuztabellenkalkulationsabfragen und Ansichten, die ich laufen lassen kann, die fantastisch auf MEMSQL laufen ... aber, in eine ideale Welt, würde ich MySQL verwenden. Ich bin bereits auf die Tatsache gestoßen, dass ich eine andere Reihe von Werkzeugen verwenden muss, um meine Instanz zu verwalten (zB: MySQL Workbench funktioniert relativ gut mit einem MEMSQL Server, aber ich muss Ansichten und Tabellen mit der Open Source SQL Workbench erstellen der mysql-java-adapter Das selbe für die Benutzung des Visual Studio MySQL-Connectors funktioniert, kann aber manchmal schmerzhaft sein, aus irgendeinem Grund kann ich Abfragen hinzufügen, kann aber keine Tabellenadapter hinzufügen) ... sorry, ich werde eine separate einreichen Frage dazu :)

Betrachtet man beide virtuellen Maschinen sind genau die gleiche Konfiguration und SSD gesichert, kann mir jemand irgendwelche Empfehlungen geben, wie meine MySQL-Instanz zu optimieren große Abfragen wie die oben auf MySQL zu optimieren? Ich verstehe, dass ich auch eine In-Memory-Datenbank erstellen kann, aber ich habe gelesen, dass es einige Persistenzprobleme geben könnte, nicht sicher.

Vielen Dank!

+0

Ist das verbundene Feld in beiden Tabellen indiziert? (Wenn es in einem zusammengesetzten Index ist, ist es das erste Feld des Index?) – Uueerdo

+0

Hi Uueerdo, nein die verbundenen Felder sind nicht indiziert. Danke, ich werde diese als Indizes hinzufügen und sehen, ob es hilft! – JDA

Antwort

3

Der wahrscheinlichste Grund dafür ist, dass Sie keinen Index für Ihre joined field in einer oder beiden Tabellen haben. Laut diesem Artikel:

https://www.percona.com/blog/2012/04/04/join-optimizations-in-mysql-5-6-and-mariadb-5-5/

Vanilla MySQL schließt sich nur verschachtelte Schleife unterstützt, die den Index erfordern eine gute Leistung (ansonsten nehmen sie quadratische Zeit).

Sowohl MemSQL als auch MariaDB unterstützen sogenannte Hash-Joins, bei denen keine Indizes für die Tabellen erforderlich sind, die jedoch mehr Speicher belegen. Da Ihr Datensatz für moderne RAM-Größen vernachlässigbar klein ist, wird dieser zusätzliche Speicheraufwand in Ihrem Fall nicht bemerkt.

Alles, was Sie tun müssen, um das Problem zu beheben, ist das Hinzufügen von Indizes auf joined field in beiden Tabellen.

Beschreiben Sie bitte auch die Probleme, die Sie mit den Open Source - Tools bei der Verbindung zu MemSQL in einer separaten Frage oder unter chat.memsql.com haben, damit wir es in der nächsten Version reparieren können (ich arbeite für MemSQL und Kompatibilität mit MySQL-Tools ist eine der Prioritäten für uns).