Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] INDEX dla pola VARCHAR(100) z powtórzeniami
Forum PHP.pl > Forum > Przedszkole
czychacz
w bazie potrzebuję zrobić coś, by móc szybko wyszukać dane z pola VARCHAR(100). w różnych rekordach dane mogą się powtarzać. czy zastosowanie INDEX-u (INDEX(nazwa_pola)) będzie odpowiednim sposobem na rozwiązanie problemu? a może powinienem zrobić jeszcze coś?
wookieb
Zależy jakie masz zapytania na używające tego pola.
czychacz
  1. SELECT id, nazwa_pola FROM nazwa_tabeli WHERE nazwa_pola LIKE '%str1%' AND nazwa_pola LIKE '%str2%' LIMIT 100

tak dla przykładu. nazwa_pola to pole VARCHAR(100) NOT NULL. str1 i str2 to ciągi znaków zdefiniowane przez użytkownika.
wookieb
Indeks dla zapytań LIKE nie działa. Musisz zastosować techniki wbudowane w takie silniki wyszukiwania ja SOLR, Sphinx (rozbijanie na słowa oraz ich indeksowanie).
Pozostaje jeszcze algorytm n-gramów.
czychacz
czyli, skoro indeks nie działa dla LIKE - muszę sam filtrować dane dla konkretnych zapytań lub zdać się na szybkość serwera MySQL?
wookieb
Należy przebudować wyszukiwanie aby nie korzystało z like. Pierwsze podpowiedzi już dałem.
Poza tym powiedz dlaczego masz akurat takie a nie inne wyszukiwanie?
czychacz
zapytanie ma na celu wyszukać wszystkie rekordy, w których nazwa_pola zawiera określone słowa. słowa nie muszą występować w odpowiedniej kolejności.

//dodatkowe info: klientem korzystającym z bazy jest aplikacja pisana w pascalu. nie wiem, czy ta informacja będzie jakkolwiek przydatna.
wookieb
Więc odeśle do mojego drugiego posta smile.gif
MrMag
Moze lepsze bedzie przeszukiwanie pelnotekstowe? (MATCH AGAINST)
phpion
Cytat(wookieb @ 8.12.2010, 14:15:38 ) *
Indeks dla zapytań LIKE nie działa.

Nie do końca masz rację.Działa jeśli ciąg nie zaczyna się od %, czyli:
  1. pole LIKE '%wartosc%'

nie zadziała, ale:
  1. pole LIKE 'wartosc%'

spowoduje użycie indeksu (oczywiście o ile będzie to korzystniejsze od skanowania).
wookieb
Cytat(phpion @ 9.12.2010, 10:33:55 ) *
Nie do końca masz rację.Działa jeśli ciąg nie zaczyna się od %, czyli:
  1. pole LIKE '%wartosc%'

nie zadziała, ale:
  1. pole LIKE 'wartosc%'

spowoduje użycie indeksu (oczywiście o ile będzie to korzystniejsze od skanowania).


Racja, ale oczywiście nie znajdzie to szerszego zastosowania w problemie kolegi.
Poza tym w takim przypadku o jakim mówisz, lepiej użyć indeksu prefixu (wyciąga parę pierwszych liter).
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.