ďťż
 
full-text search a szybkość ďťż
 
full-text search a szybkość
Zobacz wiadomości
 
Cytat
A gdyby tak się wedrzeć na umysłów górę, / Gdyby stanąć na ludzkich myśli piramidzie, / I przebić czołem przesądów chmurę, / I być najwyższą myślą wcieloną. . . Juliusz Słowacki, Kordian
Indeks BCB i MySQL subiekt gt fototapeta
 
  Witamy

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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • effulla.pev.pl
  • comp
    [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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • kfia-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

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com