[MySQL] Optymalizacja wyszukiwarki

0

Serwis generował dość duże obciążenie, więc stoi już na dedyku... Mimo to strony generują się po 5 sekund, według statystyk 90% czasu procesora zjada szukajka, a dokładnie zapytanie szukające. Z tego, co powiedzial admin, to za kazdym razem jest mielona cala baza, nie sa wykorzystywane zadne indeksy.

Zapytanie jest w stylu (nie ja je budowalem):

SELECT *, ((fraza MATCH AGAINST tytul)+(fraza MATCH AGAINST opis)+...) AS suma FROM tabela WHERE ((%wyraz1% LIKE tytul) OR (%wyraz2% LIKE tytul) OR (%wyraz1% LIKE opis) ... (%wyrazX% LIKE jakiestrzeciepole)) ORDER BY suma

(kod z pamieci, ogolny sens chyba zachowany?)

pomyslalem nad rozwiazaniem podobnym jak w phpbb2.

  • utworzona tabela words, czyli id slowa + slowo
  • utworzona tabela match_words, czyli id slowa + id obiektu
  • wyszukiwanie przez takie zapytania:
SELECT id FROM words WHERE ("slowo1" = word) OR ("slowo2" = word) OR ("slowo3" = word)
// zamiast uzycia LIKE dam lowercase

SELECT id, COUNT(word) AS licznik FROM match_words WHERE word IN (2,4,5,6) GROUP BY id ORDER BY licznik LIMIT 10
// 2,4,5,6 - z poprzedniego zapytania id-ki; licznik zeby wedlug trafnosci sortowac

SELECT count(id) FROM match_words WHERE word IN (2,4,5,6)
//do obliczania ilosci stron rzy stronicowaniu (maslo maslane ;))

prosty SELECT z pobieraniem okreslonych id z docelowej bazy

zapytania z glowy, nie testowane, mozliwe literowki

i teraz zapytanko do Was - czy dobrze mysle? Czy sa moze lepsze sposoby optymalizacji, zeby odciazyc baze?

0

Dobrze myślisz, tylko mozesz jeszcz te zapytania wszystkie w jednym zrobić - za pomocą JOIN.

0

join kojarzy mi sie wlasnie z ekstremalnie nieoptymalnymi zapytaniami, moze dlatego ze wszyscy studenci tak je buduja, a potem ja to poprawiac musze ;).

Ale nie przecze, ze w tym przypadku przyspieszy (i w rezultacie odciazy baze) - sprobowac warto...

0

W końcu dzięki JOIN (złączenie) możesz wykonać zamiast kilku zapytań jedno - mi się wydaje prawie że oczywiste, że to jest bardziej optymalne.

1 użytkowników online, w tym zalogowanych: 0, gości: 1