Nie, właściwie to robią. Teraz, jeśli nie ma wiodącego symbolu wieloznacznego, a pole jest indeksowane, co jest typową sytuacją, aparat bazy danych może zastosować do indeksu wyrażenie regularne. Na przykład, jeśli piszesz
SELECT *
FROM employees
WHERE last_name LIKE 'Cav%'
baza danych może użyć indeksu, LAST_NAME
aby znaleźć wszystkie wiersze, w których nazwisko zaczyna się na „Cav”. Z drugiej strony, jeśli miałbyś coś takiego
SELECT *
FROM employees
WHERE last_name LIKE '%av%'
baza danych musiałaby przeskanować całą tabelę (lub cały indeks) i ocenić wyrażenie pod kątem pełnej LAST_NAME
wartości. Oczywiście to bardzo drogie.
Większość lepszych relacyjnych baz danych posiada funkcje do wyszukiwania pełnotekstowego w bardziej wydajny sposób poprzez tworzenie różnego rodzaju indeksów i katalogów tekstowych, ale nie używają one słowa kluczowego LIKE. Oto na przykład fajny artykuł, który omawia wyszukiwanie pełnotekstowe w PostgreSQL .
LAST_NAME
być kandydatem na (pierwszą kolumnę w) indeks klastrowany? pps w jakim stopniu ta odpowiedź zakłada, że system bazy danych opiera się na ciągłym przechowywaniu na indeksach dysku i B-drzewa?Oprócz tego, co napisał Justin Cave, od PostgreSQL 9.1 możesz przyspieszyć każde wyszukiwanie za pomocą
LIKE
(~~
) lubILIKE
(~~*
), a także podstawowych dopasowań wyrażeń regularnych (~
). Użyj klas operatora dostarczonych przez moduł pg_trgm z indeksem GIN lub GiST, aby przyspieszyćLIKE
wyrażenia, które nie są zakotwiczone w lewo. Aby zainstalować rozszerzenie, uruchom raz na bazę danych:Utwórz indeks formularza
Lub:
Tworzenie i utrzymywanie indeksu GIN lub GiST wiąże się z pewnymi kosztami, ale jeśli twoja tabela nie jest mocno napisana, jest to świetna funkcja dla Ciebie.
Depesz napisał świetny artykuł na swoim blogu o nowej funkcji.
GIN czy GiST?
Te dwa cytaty z podręcznika powinny dostarczyć wskazówek
Ale w przypadku zapytań typu „najbliższy sąsiad” za pomocą operatora odległości
<->
:źródło
Mówiąc o MySQL, pozycja znaku wieloznacznego (%) robi różnicę. Jeśli pierwsza część tekstu jest określona jako
where first_name like 'Sta%'
, wówczas silnik DB przeszuka tylko mniejszy podzbiór słów, wpatrując się w S, następnie w St, a potem Sta itp. Jeśli zrobisz coś takiegowhere first_name like '%stan%'
, wtedy i cały skan kolumna będzie wymagana. Możesz także przejrzeć indeksy pełnotekstowe, które również wyszukują w języku naturalnym. Sprawdź dokumenty MySQL tutaj.źródło