2016-07-28 18 views
1

Ich habe eine leichte Herausforderung mit Daten, die ich gelöst werden muss. Ich habe eine Tabelle, wo der Klartext von E-Mails in einer Longtext-Spalte gespeichert ist. Es war so, bevor ich anfing, mich im Framework zu entwickeln. Es gibt über eine Million Zeilen, in denen bereits große E-Mails gespeichert sind.MySQL: Split Longtext-Spalte in mehrere Textspalten

Ich muss in diesem Feld nach Text suchen können, aber es dauert Ewigkeiten, bevor Ergebnisse zurückgegeben werden. Dies ist nicht ideal, da Hunderte von Benutzern das System verwenden und sie E-Mail-Inhalte durchsuchen können.

Ich habe die folgende einfache SQL-Anweisung versucht, aber es dauert zu lange Aufzeichnungen zu finden:
select id from emails where description like "%hello world%";

Nach dem der MySQL-Dokumentation können die Volltextindizierung nur in char, varchar und Textfelder verwendet werden.

Kann jemand einen effizienten Weg vorschlagen, in einer Longtextsäule zu suchen?

oder

Gibt es SQL Methoden/Befehle, die verwendet werden können, durch den Tisch zu laufen und Aufspalten des Inhalts des Feldes long in mehrere Textspalten für die Volltextindizierung?

Antwort

1

Ich habe die folgende einfache SQL-Anweisung versucht, aber es dauert zu lange Datensätze zu finden: select id aus E-Mail, wo Beschreibung wie „% hallo world%“;

Leider kann mysql keine Indizes für %something% Abfragen sogar auf Varchar-Felder verwenden. Tatsächlich kann es auch keine Indizes für '% etwas' Anfragen verwenden. Indizes können nur verwendet werden, wenn der Platzhalter am Ende der Zeichenfolge auftritt.

Nach dem der MySQL-Dokumentation können die Volltextindizierung nur in char, varchar und Textfelder verwendet werden.

Ich wünschte, die Dokumentation wäre hier klarer, dies spricht von TEXT Familie von Feldern. Das bedeutet, dass Sie tatsächlich einen Index für die Feldtypen LONGTEXT und MEDIUMTEXT erstellen können. Versuchen Sie dies:

CREATE TABLE ltxt(bada LONGTEXT); 
ALTER TABLE ltxt ADD FULLTEXT INDEX ftxt2(bada); 

Ja, Sie werden angenehm überrascht sein!

+0

Ich habe bereits versucht, die Volltextindizierung auf der Tabelle hinzuzufügen, aber es schlägt fehl. Hier ist die Ausgabe von einem anderen Versuch für eine neu erstellte Tabelle. 'create table sample (Beschreibung longtext);' - 'Abfrage OK, 0 Zeilen betroffen (0,20 sec)'. 'alter Tabelle Beispiel hinzufügen Volltext Index descidx (Beschreibung);' - 'ERROR 1214 (HY000): Der verwendete Tabellentyp unterstützt FULLTEXT Indizes nicht. Die Engine, die verwendet wird, ist: InnoDB. –

+0

Ich glaube, ich habe mein Problem gefunden. Ich verwende derzeit MySQL 5.5 und nicht 5.6. Die Volltextindizierung wird erst ab MySQL 5.6 zu InnoDB hinzugefügt. –

+0

Ja, das ist richtig, glücklicherweise ist das Upgraden ein müheloser Prozess – e4c5