Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wyszukiwanie i dużo pól do przeszukania - optymalnie ?
Forum PHP.pl > Forum > Bazy danych > MySQL
Mayka
Witam

Robie wyszukiwarke która będzie wyszukiwać produkty w tabeli, wyszukiwanie musi być, po kilku polach i teraz nie wiem czy takie coś będzie optymalne ?
  1. $query = "SELECT * FROM produkty WHERE tytul LIKE '%$fraza%' OR autor LIKE '%$fraza%' OR data LIKE '%$fraza%' OR tresc LIKE '%$fraza%'
  2. ORDER BY data DESC LIMIT $limit_g";


I jeszcze mam takie pytanie bo autorzy będą wyświetleni jako lista i będzie można zaznaczyć u którego autora ma szukać jak to zrobić ?
alegorn
jedno slowo okreslajace ten pomysl jesli chodzi o wydajnosc:
masakra ewentualnie, powiedzialbym czyste zło

w jednym zapytaniu udalo ci sie zgromadzic najgorsze pomysly dotyczace wyszukiwarki, a to w sumie tez niezle osiagniecie wink.gif


po pierwsze.
ogranicz maksymalnie po stronie php zakres przeszukiwania! najlepiej jesli udalo by ci sie ograniczyc przeszukiwanie do jednego pola

po drugie.
jesli juz nie uda ci sie ograniczyc ilosci pol do przeszukiwania - zamiast 'or' uzyj 'union'

po trzecie
jesli to mozliwe, ogranicz wyszukiwanie lewostronnie zamkniete (czyli 'LIKE "$costam%"') pozwoli to wykorzystac indexy


w chwili obecnej za tak napisane zapytanie - moj admin zaproponowal by ci honorowe seppuku wink.gif


a jesli nie uda ci sie skorzystac na zadnej z tych 3 rad (choc minimum 2 da sie wdrozyc) proponuje uzyc Sphinx, lub cos podobnego.

j.
gothye
zamiast wyszukiwania LIKE zastosuj index Fulltext w bazie i skorzystaj przy wyszukiwaniu za pomocą jego .

zawsze możesz użyć sphinx'a ,budowałem na nim wyszukiwarki mające po 100 i więcej parametrów wyszukiwania a indexy rekordów w takich przypadkach
są zwracane w ciągu 0.015s z bazy zawierającej 3mln rekordów !
Sephirus
Zgadzam się z przedmówcami i dodam, że zdecydowanie lepiej dać Index fulltext na objęte szukaniem pola i używać MATCH AGAINST - zawsze szybsze od tego co proponujesz smile.gif

cudny
Powiedzmy, że musisz użyć like i nie możesz pełnotekstowych index'ów (czyli źle zaprojektowana baza) to jest rozwiązanie, które pasuje do tego jak to mój przedmówca napisał honorowego sepuku biggrin.gif

  1. $query = "SELECT * FROM produkty WHERE concat(tytul,autor,data,tresc) LIKE '%fraza%' ORDER BY data DESC LIMIT $limit_g"
Mayka
No baza jest jeszcze w takim stadium że można ją troche przeprojektować smile.gif
i własnie dla tego wolałem zapytać czy jest jakaś możliwość żeby nie obciążać za mocno serwera przy wielu zapytaniach..
Dzieki za pomoc i pomysły. Bede się odyzwał jeszcze w tej sprawie wink.gif

Bo tak w międzyczasie znalazłem jeszcze na forum takie coś :
  1. $wh = array();
  2. if (!empty($_POST['imie'])) {
  3. $wh[] = 'imie = '.'"'.$_POST['imie'].'"'; //imie
  4. }
  5. if (!empty($_POST['nazwisko'])) {
  6. $wh[] = 'nazwisko = '.'"'.$_POST['nazwisko'].'"'; //nazwisko
  7. }
  8. if (!empty($_POST['adres'])) {
  9. $wh[] = 'adres = '.'"'.$_POST['adres'].'"'; //adres
  10. }
  11. if (!empty($_POST['miejscowosc'])) {
  12. $wh[] = 'miejscowosc = '.'"'.$_POST['miejscowosc'].'"'; //miejscowosc
  13. }
  14. if (!empty($wh)) {
  15. $where = 'WHERE '.implode(' and ', $wh);
  16. $query = 'SELECT * FROM tabela '.$where.' ORDER BY id DESC';
  17. } else {
  18. $query = 'SELECT * FROM tabela ORDER BY id DESC';
  19. }

Ale to chyba nie wiele zmienia ?

ilość pól niestety nie może być ograniczona.. Będzie wyszukiwanie po 6 polach
cudny
Więc użyj to co Ci zaproponowałem - poprostu łączysz sobie pola textowe i używasz na nich tylko raz LIKE, które jest wyrażeniem regularnym, a dzięki połączeniu pól textowych wykonujesz je tylko raz
Mayka
Cytat(cudny @ 16.03.2012, 13:32:29 ) *
Więc użyj to co Ci zaproponowałem - poprostu łączysz sobie pola textowe i używasz na nich tylko raz LIKE, które jest wyrażeniem regularnym, a dzięki połączeniu pól textowych wykonujesz je tylko raz


No mogę dodać
  1. ALTER TABLE Artukuly
  2. ADD FULLTEXT INDEX (tytul(20),tresc(20));
do każdego z pól ale mam pytanie jak będzie wyglądało szukanie po np. 3 polach ? Bedą brane pod uwage wszystkie 3 na raz przy wyświetlaniu wyników ?

Więc fulltext czy Like ?
Edit:
Wiec przetestowałem i :
  1. $wynik = mysql_query("SELECT * FROM produkty WHERE MATCH (tytul,autor,data,login) AGAINST('".$szukaj."') ")

Nie działa.. nie wiem dla czego jak by mogl ktoś to poprawić to bede wdzieczny..
natomiast :
  1. $wynik = mysql_query("SELECT * FROM produkty WHERE concat(tytul,autor,data,login) LIKE '%".$szukaj."%' ")

działa ale mam jeden problem jak wpisze.. 'login' to wszystko działa ale jak wpisze 'login o obrotach' -> 'mayka o obrotach' to nic nie znajduje dlaczego ?
mayka jest w tabeli z loginami, o obrotach jest w tabeli tytuł.
Niktoś
A zajrzyj tutaj,może Cie to naprowadzi:
http://dev.mysql.com/doc/refman/5.0/en/fulltext-boolean.html
cudny
Cytat(Mayka @ 16.03.2012, 16:21:25 ) *
No mogę dodać
  1. ALTER TABLE Artukuly
  2. ADD FULLTEXT INDEX (tytul(20),tresc(20));
do każdego z pól ale mam pytanie jak będzie wyglądało szukanie po np. 3 polach ? Bedą brane pod uwage wszystkie 3 na raz przy wyświetlaniu wyników ?

Więc fulltext czy Like ?
Edit:
Wiec przetestowałem i :
  1. $wynik = mysql_query("SELECT * FROM produkty WHERE MATCH (tytul,autor,data,login) AGAINST('".$szukaj."') ")

Nie działa.. nie wiem dla czego jak by mogl ktoś to poprawić to bede wdzieczny..
natomiast :
  1. $wynik = mysql_query("SELECT * FROM produkty WHERE concat(tytul,autor,data,login) LIKE '%".$szukaj."%' ")

działa ale mam jeden problem jak wpisze.. 'login' to wszystko działa ale jak wpisze 'login o obrotach' -> 'mayka o obrotach' to nic nie znajduje dlaczego ?
mayka jest w tabeli z loginami, o obrotach jest w tabeli tytuł.



No bo tak:
kolumna tytul = 'jakis tytul i tak dalej'
kolumna autor = 'to jest autor i w ogole'
kolumna data = '2010-10-12'
kolumna login = 'mayka'

po concat masz:
'jakis tytul i tak dalej to jest autor i w ogole2010-10-12mayka'
musisz dać:

'jakis tytul i tak dalej to jest autor i w ogole2010-10-12mayka' LIKE '%tytul%mayka%' wtedy ci znajdzie.
Ogólnie % to jest coś co zastępuje cokolwiek (jakikolwiek znak)
Niktoś
Cytat
'jakis tytul i tak dalej to jest autor i w ogole2010-10-12mayka'
musisz dać:

'jakis tytul i tak dalej to jest autor i w ogole2010-10-12mayka' LIKE '%tytul%mayka%' wtedy ci znajdzie.
Ogólnie % to jest coś co zastępuje cokolwiek (jakikolwiek znak)

Po to Kolega chce użyć fulltext, żeby nie używać Like który jest nieoptymalny w procesie wyszukiwania.
cudny
No, cały czas jest pisane o full text search ale w tym wyadku lepsze błdzie chyba użycie jednego wyrażenia regularnego niż 4 krotne użycie full text no nie ?
poprzez concat nie zadziała full text i trzeba będize zrobić 4 * OR
Niktoś
A spojrzałeś chociaż na ten link co podałem?
Mayka
Cytat(Niktoś @ 16.03.2012, 18:12:14 ) *
A spojrzałeś chociaż na ten link co podałem?


Pytasz mnie czy cudnego bo nie wiem..
Jesli mnie to przejzałem.. natomiast niewiem dlaczego moje zapytanie jest nie poprawne..
cudny
To było do mnie biggrin.gif Oczywiście, że nie przeglądałem tego linka (wcześniej) wink.gif
Mayka pytał o like więc dałem rozwiązanie, z tym, że $szukaj pokazywała się do każdej kolumny, więc uznałem, że szuka $szukaj w czterech kolumnach - wtedy like to zwykłe wyrażenie pojedyńcze.
Ogólnie można pokombinować z indexami pełnotextowymi, to już nie moja działka wink.gif
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.