full-text search a szybkość
Jarecki# - 17-03-2006 00:29
full-text search a szybkość
Mam tabele w MySQL 5.1 z 1,2 mln rekordów. tabelka ma 9 kolumn, z czego jedna typu 'text' ma założony fulltext index. Każda z komórek fulltexta ma dość dużo tektsu - średnio kilkadziesiąt wyrazów - słów kluczy. Zostało to już zminimalizowane i nie da się usunąć więcej z nich. Tabela przeznaczona jest do wyszukiwania webowego. zapytanie ma taką oto składnie: "select SQL_CALC_FOUND_ROWS id, kol1, kol2, kol3, kol4, kol5, match(keywords) against('key1 +key2 -key3 itd' in boolean mode) as score from tabela where match(keywords) against('key1 +key2 -key3 itd' in boolean mode) having score>0 order by score desc limit 0,50" "select FOUND_ROWS() as ile"
i niestety rezultat baza 'wypluwa' czasami po kilkunastu-kilkudziesieciu sekundach, w miare szybko to działało jak zapytanie było z limitem ale bez SQL_CALC... ale potrzebuje znać całkowitą liczbę rekordów do stronnicowania wyników.
Czy da sie jeszcze w jakiś sposób zoptymalizować samą baze albo zapytanie do niej, ew. czy ustawienia konfiguracyjne i sprzęt będą miały na to wpływ my.ini mam ustawiony z large-template'a, komp PIV 3.0 GHz 1 GB RAM, XP, Apache i MySQL - żadnych innych programów nie mam uruchomionych.
Infor946
=?ISO-8859-2?Q?Micha=B3?= Kuratczyk - 17-03-2006 00:29
"Jarecki#" <infor946@poczta.onet.pl> wrote: > i niestety rezultat baza 'wypluwa' czasami po > kilkunastu-kilkudziesieciu sekundach, w miare szybko to działało jak > zapytanie było z limitem ale bez SQL_CALC... ale potrzebuje znać > całkowitą liczbę rekordów do stronnicowania wyników.
Zdajesz sobie sprawę z tego, że jest to jeden z najczęściej popełnianych błędów przy tworzeniu programów bazodanowych? Całkowitą liczbę rekordów się szacuje, a nie oblicza. Google dysponuje znacznie większą mocą obliczeniową niż podany przez Ciebie sprzęt, a też tego nie liczy: http://www.google.pl/search?q=mysql "Wyniki 1 - 10 spośród około 246,000,000 dla zapytania mysql."
OKOŁO! Nie przeszukują całej bazy, żeby zobaczyć ile tego jest dokładnie. Szacują jedynie, żeby dać użytkownikowi pojęcie o ilości wyników, ale z bazy wyciągają tylko pierwszych (lub kolejnych) 10 wyników. Dzięki temu zaraz obok mogą napisać "Znaleziono w 0,13 sek", a nie "Znaleziono w 13 godzin". :-> Zwróć uwagę, że często, gdy chcesz przeskoczyć do ostatniej strony wyników w Google, to trafiasz na przedostatnią - dopiero wtedy zmuszasz ich do sprawdzenia czy faktycznie jest jeszcze co wyświetlić na tej ostatniej stronie.
Najlepszą metodą na przyspieszenie danej operacji jest niewykonywanie jej w ogóle. :-)
-- Michał Kuratczyk
Jarecki# - 17-03-2006 00:29
> popełnianych błędów przy tworzeniu programów bazodanowych? Całkowitą > liczbę rekordów się szacuje, a nie oblicza. Google dysponuje znacznie
a masz pomysł w jaki sposób oszacowac ile rekordów mi sie wyświelti ? po za tym co z zapytaniem które zwróci 10 rekordów - wyświetlanych na jednej stronie czy 55 - na dwóch stronach - tu już pasowałoby obliczyć a nie szacować, tylko jak ?
Infor946
=?ISO-8859-2?Q?Micha=B3?= Kuratczyk - 17-03-2006 00:29
"Jarecki#" <infor946@poczta.onet.pl> wrote: > a masz pomysł w jaki sposób oszacowac ile rekordów mi sie wyświelti ? Nie wiem jak to zrobić w MySQLu (nie wiem nawet czy się da, ale powinno się dać). W Oracle do tego celu służy ctx_query.count_hits.
> po za tym co z zapytaniem które zwróci 10 rekordów - wyświetlanych na > jednej stronie czy 55 - na dwóch stronach - tu już pasowałoby > obliczyć a nie szacować, tylko jak ? ctx_query.count_hits zwraca górny limit (chyba, że każemy mu podać dokładną wartość, ale wtedy trwa to długo). Potem po prostu pobieramy i wyświetlamy pierwszych N wyników oraz dodajemy możliwość przejścia do kolejnych stron wyników na podstawie szacunków. Jak użytkownik wybierze którąś stronę wyników, to próbujemy pobrać je z bazy - jak się nie da, to znaczy, że przeszacowaliśmy, więc pobieramy po prostu ostatnią stronę wyników i informujemy, że więcej już nie ma.
-- Michał Kuratczyk
Jarecki# - 17-03-2006 00:29
> Nie wiem jak to zrobić w MySQLu (nie wiem nawet czy chyba jednak nie ma takiej funkcji w mysqlu
Infor946
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[mySQL] pomoc w zapytaniu zmieniajacym slow o w polu text
zmrozenie przy Reading Text Glob... PS CS
Access i nowe rekordy typu text
[postgres] castowanie: domain na text -> date
Corel - paragraph text i wyrowanie w ramce
input text
text on path
MySQL - ERROR 1114 (HY000): The table is full
=?iso-8859-2?q?[MySQL]_FullText-Search_i_trafno=B6=E6_(zawsze_1)_i_szacowanie?=
Sql Server, File group is full
zanotowane.pldoc.pisz.plpdf.pisz.plkfia-tek.keep.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|