Nein, das ist so ziemlich das, was sie tun. Wenn jetzt kein führender Platzhalter vorhanden ist und das Feld indiziert ist, was in der Regel der Fall ist, kann das Datenbankmodul den regulären Ausdruck auf den Index anwenden. So zum Beispiel, wenn Sie schreiben
SELECT *
FROM employees
WHERE last_name LIKE 'Cav%'
Die Datenbank kann den Index für verwenden LAST_NAME
, um alle Zeilen zu finden, in denen der Nachname "Cav" beginnt. Auf der anderen Seite, wenn Sie so etwas hatten
SELECT *
FROM employees
WHERE last_name LIKE '%av%'
Die Datenbank müsste die gesamte Tabelle (oder den gesamten Index) durchsuchen und den Ausdruck anhand des vollständigen LAST_NAME
Werts auswerten . Das ist natürlich sehr teuer.
Die meisten der besseren relationalen Datenbanken verfügen über Funktionen zur effizienteren Volltextsuche, indem verschiedene Arten von Indizes und Textkatalogen erstellt werden, die jedoch nicht das Schlüsselwort LIKE verwenden. In diesem Artikel wird beispielsweise die Volltextsuche in PostgreSQL beschrieben .
LAST_NAME
sie ein kandidat für (die erste spalte in) den clustered index? pps Inwieweit geht diese Antwort davon aus, dass das Datenbanksystem auf zusammenhängendem Speicher auf Datenträgern und B-Tree-Indizes basiert?Zusätzlich zu dem, was Justin Cave geschrieben hat, können Sie seit PostgreSQL 9.1 jede Suche mit
LIKE
(~~
) oderILIKE
(~~*
) beschleunigen und auch grundlegende Übereinstimmungen mit regulären Ausdrücken (~
). Verwenden Sie die Operator-Klassen, die vom Modul pg_trgm mit einem GIN- oder GiST-Index bereitgestellt werdenLIKE
, um nicht verankerte Ausdrücke zu beschleunigen . Führen Sie einmal pro Datenbank aus, um die Erweiterung zu installieren:Erstellen Sie einen Index des Formulars
Oder:
Das Erstellen und Verwalten eines GIN- oder GiST-Index ist mit Kosten verbunden. Wenn Ihre Tabelle jedoch nicht stark geschrieben ist, ist dies eine großartige Funktion für Sie.
Depesz hat in seinem Blog einen ausgezeichneten Artikel über die neue Funktion geschrieben.
GIN oder GIST?
Diese beiden Anführungszeichen aus dem Handbuch sollten eine Orientierungshilfe sein
Bei Abfragen vom Typ "nächster Nachbar" mit dem Distanzoperator
<->
:quelle
Bei MySQL macht die Position des Platzhalterzeichens (%) einen Unterschied. Wenn der erste Teil des Textes wie angegeben wird
where first_name like 'Sta%'
, dann werden die DB - Engine suchen nur eine kleinere Teilmenge von Worten mit S starren, dann nach St. gehen, und dann Sta, etc. Wenn Sie etwas tun , wiewhere first_name like '%stan%'
, dann und gesamte Scan des Spalte wird benötigt. Sie können auch in Volltextindizes suchen, in denen auch nach natürlichen Sprachen gesucht wird. Schauen Sie sich hier die MySQL-Dokumente an.quelle