czychacz
8.12.2010, 10:11:13
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
8.12.2010, 12:05:17
Zależy jakie masz zapytania na używające tego pola.
czychacz
8.12.2010, 13:20:57
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
8.12.2010, 14:15:38
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
8.12.2010, 17:15:40
czyli, skoro indeks nie działa dla LIKE - muszę sam filtrować dane dla konkretnych zapytań lub zdać się na szybkość serwera MySQL?
wookieb
8.12.2010, 21:59:31
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
9.12.2010, 09:31:00
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
9.12.2010, 09:56:44
Więc odeśle do mojego drugiego posta
MrMag
9.12.2010, 10:22:44
Moze lepsze bedzie przeszukiwanie pelnotekstowe? (MATCH AGAINST)
phpion
9.12.2010, 10:33:55
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:
pole LIKE '%wartosc%'
nie zadziała, ale:
pole LIKE 'wartosc%'
spowoduje użycie indeksu (oczywiście o ile będzie to korzystniejsze od skanowania).
wookieb
9.12.2010, 10:42:19
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:
pole LIKE '%wartosc%'
nie zadziała, ale:
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.