2016-08-17 3 views
7

In meiner Datenbank habe ich eine Tabelle, die eine CompanyId enthält, die auf eine Firma verweist, und etwas Text. Ich würde gerne eine FULLTEXT-Suche machen, aber da ich immer Anfragen an eine bestimmte Firmen-ID mache, würde ich gerne einen zusammengesetzten Schlüssel verwenden, der meine Firmen-ID und den Volltextindex kombiniert. Gibt es das überhaupt zu tun? Wie ich denke, das ist nicht möglich, was ist der optimale Weg, um Indizes zu erstellen, so dass die folgende Abfrage am schnellsten ist?Volltextindex kombiniert mit normalem Index

wird die Anforderung immer ein Volltext-Index sein

SELECT * FROM textTable 
WHERE companyId = ? (Possibly more conditions) AND 
    MATCH(value) AGAINST("example") 

Soll ich meine Indizes für Integer-Spalten normalerweise erstellen und hinzufügen? oder sollte ich die Spalte value in den Index aufnehmen? Vielleicht beide ?

+0

Warum erstellen Sie nicht beide, zeigen Sie den Ausführungsplan an, um zu sehen, welcher Index verwendet wird, und entscheiden Sie sich dann? – trincot

+0

Haben Sie das schon überprüft? http://stackoverflow.com/questions/1173418/sql-server-normal-index-vs-fulltext-index auch dies (beachten Sie, dass ist jedoch über 3 Jahre alt): https://makandracards.com/makandra/12813 -performance-analyse-von-mysql-s-fulltext-indexes-und-like-queries-for-full-text-suche –

+0

@trincot Ich könnte das für die Indizes tun, die ich im Sinn habe, aber ich werde nicht in der Lage sein Indizes zu erstellen, an die ich nicht gedacht habe. Und ich versuche, Einsichten zu bekommen, die ich selbst nicht finden kann. p.marino: Meine Frage ist nicht zu bestimmen, ob ich einen Volltextindex oder einen normalen Index verwenden soll, sondern wie man einen zusammengesetzten Schlüssel kombiniert (und wenn ich nicht kann, der nächste Ansatz) – hilnius

Antwort

0

Warum wählen Sie alles? Dies wird die Abfrageleistung nicht verbessern. Sie müssen nur die Spalten auswählen, die Sie benötigen. Dies würde den Zeitaufwand beim Scannen der Tabelle verringern.

Bei der FULLTEXT-Suche sortiert Ihre Methode die Ergebnisse nach Relevanz und verwendet dann die Indexsuche basierend auf Ihrer WHERE-Klausel. Sie müssen das also in eine direkte Suche umwandeln, indem Sie die Indexsuche innerhalb Ihrer SELECT-Klausel hinzufügen.

Die Abfrage sollte wie folgt sein:

SELECT 
    MATCH(value) AGAINST("example") 
FROM 
    textTable 

Sie können mehrere Filter hinzufügen, basierend auf WHERE-Klausel, oder besser können Sie beinhalten IF-Anweisung oder CASE oder jede andere Funktion, wenn Sie würde.

etwas wie folgt aus:

SELECT 
    IF(MATCH(value) AGAINST("example"), 'Your Returned value if TRUE', 'Your returned value if FALSE') 
FROM textTable 

Dies wird einen vollständigen Tabellenscan tun, und das ist schneller.

Für die Indexierung, Sie können Index auf CompanyId verwenden und Wert damit einschließen. Sie können dasselbe mit allen anderen Spalten tun, die Sie in SELECT, WHERE und ORDER BY verwenden.

Verwandte Themen