Frage

Wer weiß, was die Komplexität des für die gängigsten Datenbanken SQL LIKE Operator ist?

War es hilfreich?

Lösung

Lassen Sie uns die drei Kern Fälle separat betrachten. Diese Diskussion ist MySQL-spezifisch, sondern kann auch auf andere DBMS aufgrund der Tatsache gelten, dass Indizes sind in der Regel auf eine ähnliche Art und Weise umgesetzt werden.

LIKE 'foo%' ist schnell, wenn sie auf einer indizierten Spalte ausgeführt werden. MySQL-Indizes eine Variation von B-Bäume sind, so dass, wenn diese Abfrage durchführen kann es absteigen einfach den Baum an den Knoten foo entspricht, oder die erster Knoten mit dem Präfix und durchquert den Baum nach vorne. All dies ist sehr effizient.

LIKE '%foo' nicht durch Indizes beschleunigt werden und in einer vollständigen Tabellenscan führen. Wenn Sie andere Kriterien haben, die von ausgeführt unter Verwendung von Indizes kann, wird es nur die Zeilen scannen, die nach dem bleiben Ausgangsfilterung.

Es ist ein Trick, obwohl : Wenn Sie Suffix passende tun müssen - für Dateinamen mit der Endung .foo suchen, zum Beispiel - Sie die gleiche Leistung durch das Hinzufügen einer Spalte mit dem gleichen Inhalt wie das erreicht werden können Original, aber mit den Zeichen in umgekehrter Reihenfolge.

ALTER TABLE my_table ADD COLUMN col_reverse VARCHAR (256) NOT NULL;
ALTER TABLE my_table ADD INDEX idx_col_reverse (col_reverse);
UPDATE my_table SET col_reverse = REVERSE(col);

Die Suche nach Zeilen mit col in .foo endet dann:

SELECT * FROM my_table WHERE col_reverse LIKE 'oof.%'

Schließlich gibt es LIKE '%foo%', für die keine Abkürzungen gibt. Wenn es keine anderen einschränkenden Kriterien sind, die die Menge der Zeilen eine machbare Anzahl reduziert, wird es eine harte Leistungseinbußen führen. Sie könnten stattdessen eine Volltextsuche Lösung prüfen möchten, oder eine andere spezialisierte Lösung.

Andere Tipps

Wenn Sie über die Auswirkungen auf die Leistung fragen:

Das Problem ist, dass es die Datenbank verwenden, einen Index hält. Auf Oracle ich denke, es Indizes nicht mehr verwendet werden (aber ich bin immer noch auf Oracle 9). SqlServer verwendet Indizes, wenn die Platzhalter nur am Ende ist. Ich weiß nicht, über andere Datenbanken.

Abhängig von dem RDBMS, die Daten (und möglicherweise Größe der Daten), Indizes und wie dergleichen verwendet wird (mit oder ohne Präfix Wildcard)!

Sie sind zu allgemein eine Frage zu stellen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top