Weiß jemand, wie hoch der Aufwand für die SQL LIKE
Operator für die gängigsten Datenbanken?
Antworten
Zu viele Anzeigen?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.
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.