Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL] INDEX dla pola VARCHAR(100) z powtórzeniami, to, czy może coś innego?
czychacz
post 8.12.2010, 10:11:13
Post #1





Grupa: Zarejestrowani
Postów: 189
Pomógł: 13
Dołączył: 20.09.2008
Skąd: Lublin

Ostrzeżenie: (0%)
-----


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ś?

Ten post edytował czychacz 8.12.2010, 11:36:18
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 10)
wookieb
post 8.12.2010, 12:05:17
Post #2





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Zależy jakie masz zapytania na używające tego pola.


--------------------
Go to the top of the page
+Quote Post
czychacz
post 8.12.2010, 13:20:57
Post #3





Grupa: Zarejestrowani
Postów: 189
Pomógł: 13
Dołączył: 20.09.2008
Skąd: Lublin

Ostrzeżenie: (0%)
-----


  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.
Go to the top of the page
+Quote Post
wookieb
post 8.12.2010, 14:15:38
Post #4





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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.


--------------------
Go to the top of the page
+Quote Post
czychacz
post 8.12.2010, 17:15:40
Post #5





Grupa: Zarejestrowani
Postów: 189
Pomógł: 13
Dołączył: 20.09.2008
Skąd: Lublin

Ostrzeżenie: (0%)
-----


czyli, skoro indeks nie działa dla LIKE - muszę sam filtrować dane dla konkretnych zapytań lub zdać się na szybkość serwera MySQL?
Go to the top of the page
+Quote Post
wookieb
post 8.12.2010, 21:59:31
Post #6





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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?


--------------------
Go to the top of the page
+Quote Post
czychacz
post 9.12.2010, 09:31:00
Post #7





Grupa: Zarejestrowani
Postów: 189
Pomógł: 13
Dołączył: 20.09.2008
Skąd: Lublin

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
wookieb
post 9.12.2010, 09:56:44
Post #8





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Więc odeśle do mojego drugiego posta smile.gif


--------------------
Go to the top of the page
+Quote Post
MrMag
post 9.12.2010, 10:22:44
Post #9





Grupa: Zarejestrowani
Postów: 154
Pomógł: 5
Dołączył: 24.02.2004

Ostrzeżenie: (0%)
-----


Moze lepsze bedzie przeszukiwanie pelnotekstowe? (MATCH AGAINST)


--------------------
Go to the top of the page
+Quote Post
phpion
post 9.12.2010, 10:33:55
Post #10





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




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).
Go to the top of the page
+Quote Post
wookieb
post 9.12.2010, 10:42:19
Post #11





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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).


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 8.07.2025 - 05:51