MySQL-Speicher-Engine-Dilemma

7

Es gibt zwei MySQL-Datenbankfunktionen, die ich in meiner Anwendung verwenden möchte. Die erste ist FULL-TEXT-SEARCH und TRANSACTIONS.

Nun, das Dilemma ist, dass ich dieses Feature nicht in einer Speicher-Engine bekommen kann. Entweder ich benutze MyIsam (das die FULL-TEXT-SEARCH Funktion hat) oder ich verwende InnoDB (welches die TRANSACTION Funktion unterstützt). Ich kann nicht beides haben.

Meine Frage ist, ob ich sowieso beide Funktionen in meiner Anwendung haben kann, bevor ich gezwungen bin, zwischen den beiden Speicher-Engines zu wählen.

    
burntblark 25.11.2011, 18:16
quelle

5 Antworten

10

Mögliche Problemumgehungen:

  1. Verwenden Sie Sphinx oder Solr oder eine andere externe Textsuchmaschine für Ihre Textsuche und verwenden Sie die InnoDB-Engine.

  2. Schreiben Sie Ihren eigenen Suchcode - und verwenden Sie InnoDB. Dies ist nicht wirklich eine Option, es sei denn, Sie suchen die Bedürfnisse sind begrenzt oder Ihr Budget ist riesig.

  3. Verwenden Sie beide Engines, MyISAM und InnoDB. Behalten Sie die Spalten, in denen Sie Volltextsuche in MyISAM sein möchten, und den Rest in InnoDB. Dies wird riskant sein, da die Daten in MyISAM nicht transaktionssicher sind.

  4. Verwenden Sie beide Engines, MyISAM und InnoDB. Bewahren Sie alle Daten in InnoDB auf und duplizieren Sie die Spalten, die Sie in MyISAM als Volltextsuche verwenden möchten. Dies wird einige Mechanismen (Trigger) für die Datenduplizierung benötigen.

  5. Warten Sie auf die Version von MySQL, in der die Volltextsuche von InnoDB oder einer anderen Transaktionsmaschine unterstützt wird.

  6. (Option 4), aber verwenden Sie MariaDB (eine MySQL-Verzweigung), die "crashsichere" (aber immer noch nicht transaktionssichere) Volltextindizes hat: Wann wird-transaktional-fulltext-indexes-bereit sein?

  7. Verwenden Sie andere RDBMS wie PostgreSQL mit Volltextunterstützung in der Transaktions-Engine.

ypercubeᵀᴹ 25.11.2011, 18:34
quelle
5

Wenn Sie Transaktionen und Volltexte für eine einzelne Tabelle in MySQL ausführen müssen, haben Sie einige Optionen. Aber wirklich der Hauptpunkt, der von dieser ganzen Diskussion weggenommen werden sollte, ist, dass Datenbanken nicht gut in der Volltextsuche sind (besonders MySQL!) Und idealerweise Sie diese Arbeit zu einer Komponente abladen möchten, die diesen Typ besser durchführt der Aufgabe.

Option 1:

Erstellen Sie eine Tabelle, für die Sie die Transaktion ausführen müssen, als InnoDB, und erstellen Sie dann eine weitere "Spiegel" -Tabelle, bei der es sich um MyISAM handelt, für die Sie eine Volltextsuche durchführen können. Sie können die Daten synchron halten, indem Sie einen Trigger für die InnoDB-Tabelle verwenden. Irgendwie ein Hack, aber es wird funktionieren.

Option 3:

Sieh dir eine Volltext-Engine von Drittanbietern wie Sphinx , Lucene oder Solr . Auf diese Weise können Sie sich darauf konzentrieren, Ihre Datenbank so zu gestalten, dass sie Daten optimal abfragt und sie nicht zur Textsuche zwingt.

Option 3:

Sie können wählen, ob Sie einen anderen Datenbankserver verwenden möchten, der gleichzeitig Transaktionen und Volltextsuche unterstützt, wie z. B. SQL Server.

Hoffe, das gibt Ihnen etwas Klarheit.

Viel Spaß!

    
Doug 25.11.2011 18:28
quelle
3

Der MyISAM-Volltextindex ist wahrscheinlich nicht so gut wie Sie denken. Es funktioniert ok (ish) bei kleinen Daten, ist aber bei größeren Daten miserabel.

In MySQL 5.6 haben wir vielleicht Volltext auf InnoDB, aber es unterstützt immer noch nicht die meisten Funktionen, die eine echte Volltext-Suchmaschine haben würde.

    
MarkR 25.11.2011 20:22
quelle
2

Es gibt keine Möglichkeit, beides in der gleichen Datenbank-Engine zu haben. Dies sind die Einschränkungen, die durch das Design von MySQL gegeben sind. Du kannst die Physik nicht ändern. ; -)

Zypern
Ссылка

Wenn Sie sich noch in der Entwurfsphase befinden, können Sie auch eine andere SQL-Implementierung für Ihr Projekt in Betracht ziehen, die beide in derselben Engine unterstützt. Postgres zum Beispiel tut es.

Ссылка

    
Kaii 25.11.2011 18:22
quelle
1

Eine weitere Option ist die Unterstützung von MySQL für die Replikation:

Zum Beispiel können Sie Master-Server mit InnoDB Storage Engine einrichten. Dann replizieren Sie mit der MyISAM-Speicher-Engine auf einen anderen schreibgeschützten Server.

Sie können fast jede MySQL-Speicher-Engine verwenden und es gibt möglicherweise einige, die bessere Suchfunktionen als MyISAM für einige Anwendungsfälle unterstützen.

    
jheusala 07.04.2012 11:26
quelle

Tags und Links