3 Stimmen

SQL `LIKE` Komplexität

Weiß jemand, wie hoch der Aufwand für die SQL LIKE Operator für die gängigsten Datenbanken?

15voto

Emil H Punkte 38928

Betrachten wir die drei wichtigsten Fälle getrennt. Diese Diskussion ist MySQL-spezifisch, kann aber auch für andere DBMS gelten, da Indizes in der Regel auf ähnliche Weise implementiert werden.

LIKE 'foo%' ist schnell, wenn es auf einer indizierten Spalte ausgeführt wird. MySQL-Indizes sind eine Abwandlung von B-Bäumen, so dass bei der Durchführung dieser Abfrage einfach der Baum bis zu dem Knoten herabsteigen kann, der der foo oder den ersten Knoten mit diesem Präfix, und durchlaufen den Baum vorwärts. All dies ist sehr effizient.

LIKE '%foo' kann nicht durch Indizes beschleunigt werden und führt zu einem vollständigen Tabellenscan. Wenn Sie andere Kriterien haben, die über Indizes ausgeführt werden können, werden nur die Zeilen durchsucht, die nach der anfänglichen Filterung übrig bleiben.

Allerdings gibt es einen Trick : Wenn Sie einen Suffix-Abgleich durchführen müssen - Suche nach Dateinamen mit Endung .foo Sie können die gleiche Leistung erzielen, indem Sie eine Spalte mit demselben Inhalt wie die ursprüngliche Spalte hinzufügen, 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);

Suche nach Zeilen mit col endend mit .foo wird dann:

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

Schließlich ist da noch LIKE '%foo%' für die es keine Abkürzungen gibt. Wenn es keine anderen einschränkenden Kriterien gibt, die die Anzahl der Zeilen auf eine vertretbare Anzahl reduzieren, wird dies einen harten Leistungseinbruch verursachen. Sie sollten stattdessen eine Lösung für die Volltextsuche oder eine andere spezialisierte Lösung in Betracht ziehen.

1voto

Mitch Wheat Punkte 287474

Hängt vom RDBMS, den Daten (und möglicherweise der Größe der Daten), den Indizes und der Art der Verwendung des LIKE (mit oder ohne Präfix-Wildcard) ab!

Sie stellen eine zu allgemeine Frage.

1voto

Stefan Steinegger Punkte 62197

Wenn Sie nach den Auswirkungen auf die Leistung fragen:

Das Problem von like ist, dass es die Datenbank daran hindert, einen Index zu verwenden. Bei Oracle werden, glaube ich, keine Indizes mehr verwendet (aber ich bin noch auf Oracle 9). SqlServer verwendet Indizes, wenn der Platzhalter nur am Ende steht. Ich weiß nicht, wie es bei anderen Datenbanken ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X