W moim poście tu opisać w szczegółach, to technika, która pozwala na użyć indeksu z LIKE
do szybkiego %infix%
poszukiwaniu, kosztem pewnego dodatkowego miejsca:
https://stackoverflow.com/a/22531268/543814
Tak długo, jak struny są stosunkowo małe, wymagania dotyczące pamięci są ogólnie do przyjęcia.
Według Google średni adres e-mail to 25
znaków. Spowoduje to zwiększenie wymaganej pamięci średnio o współczynnik 12.5
i zapewnia szybkie indeksowanie w zamian. (Zobacz mój post do obliczeń.)
Z mojego punktu widzenia, jeśli przechowujesz 10 000 adresów e-mail, powinieneś dobrze przechowywać (odpowiednik) około 100 000 adresów e-mail. Jeśli to wystarczy, aby umożliwić korzystanie z indeksu, wydaje się, że jest to akceptowalny kompromis. Często miejsce na dysku jest tanie, a wyszukiwania nieindeksowane są niedostępne.
Jeśli zdecydujesz się na takie podejście, sugeruję ograniczenie długości wprowadzania adresów e-mail do 64
znaków. Te rzadkie (lub atakujące) adresy e-mail o takiej długości będą wymagać dorazy więcej niż zwykle. To daje:
- Ochrona przed intruzem próbującym zalać Twoją bazę danych, ponieważ nadal nie są to imponujące ilości danych.
- Oczekiwanie, że większość adresów e-mailowych nie ma takiej długości.
Jeśli wziąć pod uwagę 64
znaków zbyt surowy wymóg, należy 255
zamiast na najgorszym wzrost magazynowania czynnika 127.5
. Śmieszny? Możliwie. Prawdopodobne? Nie. Szybko? Bardzo.
[To wyjaśnienie] (http://use-the-index-luke.com/sql/where-clause/searching-for-ranges/like-performance-tuning) może pomóc zrozumieć, dlaczego to nie działa. –
[** Ta odpowiedź **] (http://stackoverflow.com/a/22531268/793309) pokazuje ładną technikę - indeksowanie wszystkich sufiksów - dzięki czemu tego typu zapytanie może działać bardzo dobrze, ale kosztem niektórych dodatkowe kodowanie i większe wymagania dotyczące pamięci. – antinome