Dzieki
Michal
2 mln rekord�w na dzie� to nie jest jaka� zawrotna liczba.
> Od czego zaczac?
Od sprecyzowania problemu, bo z tego co napisa�e� nic nie wynika.
M.
Za ma�o informacji podajesz. Podaj struktur� tej tabeli i do czego ona s�u�y.
Czyli czy jest tylko odczytywana (i jak), czy sďż˝ aktualizacje, czy rekordy sďż˝
usuwane? Czy wszystkie rekordy musz� by� dost�pne czy mo�e cz�� mo�na przesuna�
do tabeli archiwalnej?
I konkrety - co to znaczy, �e nie da si� zarz�dza�/wyszukiwa�? Jakiego czasu
realizacji zapytania oczekujesz, a jaki jest obecnie?
--
S�awomir Szysz�o
Primus inter FAQires & Grand Inquisitor no.0 of pl.comp.bazy-danych
FAQ pl.comp.bazy-danych http://www.dbf.pl/faq/
Archiwum http://groups.google.com/groups?group=pl.comp.bazy-danych
To tylko srednio 23 inserty na sekunde ;)
Jak pisali inni - za malo danych podajesz.
Czy rownie duzo jest "wyszukiwania"?
Czy "wyszukiwanie" ma operowac na aktualnych danych, czy dopuszczasz pewne
opoznienie (na przyklad kilka sekund)
--
Michał /sn1p3r/ Gruchała
> I konkrety - co to znaczy, że nie da się zarządzać/wyszukiwać? Jakiego czasu
> realizacji zapytania oczekujesz, a jaki jest obecnie?
Dziekuje za odpowiedzi. Oto struktura tabeli:
Field Type Collation Attributes Null Default Extra
source_ip varchar(20) latin1_swedish_ci No None
source_name varchar(250) latin1_swedish_ci No None
date_time varchar(250) latin1_swedish_ci No None
facility varchar(250) latin1_swedish_ci No None
facility_num varchar(250) latin1_swedish_ci No None
severity varchar(250) latin1_swedish_ci No None
severity_num varchar(250) latin1_swedish_ci No None
origin varchar(250) latin1_swedish_ci No None
tag varchar(250) latin1_swedish_ci No None
message longtext latin1_swedish_ci No None
raw_syslog longtext latin1_swedish_ci No None
Problem polega na tym ze kiedy probujemy cos wyszukac w tabeli
uzywajac phpMyAdmina to zapytanie trwa 5h i tak nie zwraca calkowitego
wyniku z powodu timeoutu. Rekordy do bazy sa tylko dodawane, nie ma
aktualizacji. Tabela zawiera logi wypluwane przez serwer. Pomysl byl
takie zeby ta jedna tabele dzielic na kilka mniejszych bo 2miliony
rekordow dziennie to dla nas ogromna ilosc. Jednak oprogramowanie
ktore wypluwa logi nie moze dzielic danych na kilka tabel wiec trzeba
by to robic recznie albo php. Chcielibysmy miec mozliwosc wyszukiwania
okreslonych rekordow na zyczenie klienta. Opoznienie kilku sekund jest
dopuszczalne.
Na tabeli nie ma zadnych indexow, nie wiem od czego zaczac wiec
poczekam na rady starszych.
Michal
je�li wi�kszo�� zapyta� w warunku posiada ograniczenie na dat� to mo�esz
rozwa�y� wst�pne partycjonowanie po jakim� woluminie czasowym. je�li
zapytania kr�c� si� wok� klienta i jego numeru IP to mo�e warto
rozwa�y� partycjonowanie pierwszego rz�du po fragmentach adresu IP. a
mo�e zapytania s� takie, �e sprawdzi si� partycjonowanie haszowe.
mo�liwo�ci jest kilka i my�l�, �e co� powinno da� si� wybra� w
zale�no�ci od przyk�adowych zapyta�. odradza�bym wszelkie r�czne
manipulacje.
pozdrawiam,
geos
1.
Zacznij od tego, zeby jedna zalozyc indeksy na polach po ktorych
wyszukujesz!
5h zapytanie - a czego sie spodziewasz, skoro nie ma indeksow?! Baza
musi byc "recznie" przejrzana przez serwer, rekord po rekordzie.
2. nie wiem jak mysql ale dla MSSQL'a to nie jest jakas ogromna liczba
- potraf zarzadzac znacznie wiekszymi zbiorami danych, wiec moze warto
sie mu przyjrzec
3. sproboj zrobic dodatkowa tabele, "historyczna" gdzie beda
przechowywane dane np. od poprzedniego miesaica wstecz
logi niech leca do bazy do ktorej ida, a po miesiacu sa z niej
przenososzne do innej tabeli.
oczywiscie - muisz uwzglednic zapytania, jakie wykonujecie - jak
daleko wstecz siegacie, czy mozna podzielic zapytania na "aktualny
miesiac" + "cala reszta' czy tez nie, ew. przebudowac zapytanie, zeby
sparwdzalo jezeli podana data jest w aktualnym miesiacu to nie tykam
histori inaczej leci po wszystkim (teoretyzuje teraz)
pozdrawiam
Bolo
tam s� dwa miliony rekord�w dziennie, tabela prawdopodobnie nie jest
spartycjonowana, ca�y czas s� wstawiane dane, 23 inserty na sekund�,
indeks musia�by by� ca�y czas przebudowywany w trakcie takich operacji.
do tego dochodzďż˝ odczyty i nie wiesz jeszcze jak selektywne sďż˝ ich
zapytania, by� mo�e indeks nie by�by w og�le wykorzystywany. indeksy nie
sďż˝ remedium na wszystko i ich zastosowanie powinno byďż˝ poprzedzone
znacznie powa�niejsz� analiz�.
tak jak napisa� S�awomir Szysz�o: niech w�tkotw�rca poda opr�cz
struktury logicznej tabeli jej bie��c� struktur� fizyczn� i kilka innych
informacji. dodatkowo przyk�adowe zapytania. by� mo�e indeksy si�
przydadz�, ale wcze�niej nale�y to przeanalizowa�.
geos
Jakie dane przechowuje tabela?
Co w niej chcesz wyszukiwać?
W
powtarza sie Xset razy, proponuje wyniesc do odzielnej tabelki
> date_time varchar(250) latin1_swedish_ci No None
czemu varchar?
> facility varchar(250) latin1_swedish_ci No None
> facility_num varchar(250) latin1_swedish_ci No None
analogicznie - do oddzielnej tabelki , nie jako tekst
> severity varchar(250) latin1_swedish_ci No None
> severity_num varchar(250) latin1_swedish_ci No None
zapewne tez - do odzielnej tabelki i nie jako tekst
> origin varchar(250) latin1_swedish_ci No None
> tag varchar(250) latin1_swedish_ci No None
> message longtext latin1_swedish_ci No None
> raw_syslog longtext latin1_swedish_ci No None
> Problem polega na tym ze kiedy probujemy cos wyszukac w tabeli
> uzywajac phpMyAdmina to zapytanie trwa 5h i tak nie zwraca calkowitego
> wyniku z powodu timeoutu. Rekordy do bazy sa tylko dodawane, nie ma
> aktualizacji. Tabela zawiera logi wypluwane przez serwer. Pomysl byl
> takie zeby ta jedna tabele dzielic na kilka mniejszych bo 2miliony
> rekordow dziennie to dla nas ogromna ilosc. Jednak oprogramowanie
przy pewnej skali zawsze dobym pomyslem jest shardowanie.
zrob kilka klastrow powiedzmy X, maszyny rozrzucasz na te klastry i juz.
> Na tabeli nie ma zadnych indexow, nie wiem od czego zaczac wiec
> poczekam na rady starszych.
indeksy dodaj na to po czym szukasz ...
ale uwazaj, im wiecej indeksow, tym szybciej sie "czyta" po nich ale tym
wolniej sie zapisuje, bo indeks musi byc przebudowany.
--
Michał /sn1p3r/ Gruchała
true, full scan musi machanc ;/
> tam są dwa miliony rekordów dziennie, tabela prawdopodobnie nie jest
> spartycjonowana, cały czas są wstawiane dane, 23 inserty na sekundę,
> indeks musiałby być cały czas przebudowywany w trakcie takich operacji.
23 przebudowania indeksow na sekunde, to nie jest hardcore.
tam sa same pola typu tekst - tam nawet nie ma jak sensownie indeksow
zrobic, zeby bylo ok ;/
> do tego dochodzą odczyty i nie wiesz jeszcze jak selektywne są ich
> zapytania, być może indeks nie byłby w ogóle wykorzystywany. indeksy nie
> są remedium na wszystko i ich zastosowanie powinno być poprzedzone
> znacznie poważniejszą analizą.
nie sa ale odpowiednio uzyte czynia cuda.
nagle zapytanie, ktore trwalo 5h moze trwac 10 sekund
--
Michał /sn1p3r/ Gruchała
> On May 20, 12:48 pm, Sławomir Szyszło <slasz...@CIACHTOlist.pl> wrote:
>
>> I konkrety - co to znaczy, że nie da się zarządzać/wyszukiwać? Jakiego
>> czasu realizacji zapytania oczekujesz, a jaki jest obecnie?
>
>
> Dziekuje za odpowiedzi. Oto struktura tabeli:
[...]
generalnie: proponuje znormalizowac baze.
Bedzie zajmowac mniej miejsca, bedzie szybciej.
--
Michał /sn1p3r/ Gruchała
nie jest nie jest, mysql spokojnie daje rade z takimi bazami.
zle zaprojektowana baza polozy i mysql i mssql a zapewne najszybciej oracle
hehe
--
Michał /sn1p3r/ Gruchała
co to za soft?
czy nie sa to logi sysloga?
> by to robic recznie albo php. Chcielibysmy miec mozliwosc wyszukiwania
> okreslonych rekordow na zyczenie klienta. Opoznienie kilku sekund jest
> dopuszczalne.
Jesli jest dopuszczalne, to proponuje do tej bazy podlaczyc baze slave.
Na bazie master nie dajesz indeksow - zapisy beda mozliwie szybkie.
Na bazie slave (pamietaj, tylko do odczytu!!) dajesz indeksy na to, co Cie
interesuje i na niej robisz wyszukiwanie (ktore nie obciaza bazy master,
wiec logi jak lecialy, tak leca).
Conajwyzej po zadaniu zapytania na bazie slave opozni sie replikacja danych
i nie beda zsyncowane (trzeb abedzie poczekac az baza slave "nadgoni").
Bazy sie replikuja asynchronicznie, wiec baza slave moze miec obiazenie.
--
Michał /sn1p3r/ Gruchała
> co to za soft?
> czy nie sa to logi sysloga?
Tak
> Jesli jest dopuszczalne, to proponuje do tej bazy podlaczyc baze slave.
> Na bazie master nie dajesz indeksow - zapisy beda mozliwie szybkie.
> Na bazie slave (pamietaj, tylko do odczytu!!) dajesz indeksy na to, co Cie
> interesuje i na niej robisz wyszukiwanie (ktore nie obciaza bazy master,
> wiec logi jak lecialy, tak leca).
> Conajwyzej po zadaniu zapytania na bazie slave opozni sie replikacja danych
> i nie beda zsyncowane (trzeb abedzie poczekac az baza slave "nadgoni").
Bede musial sie troche doksztalcic w tym kierunku, bo nigdy nie mialem
stycznosci z tego rodzaju operacjami. Jednak wydaje sie to byc dobrym
pomyslem. Do tej pory dzialalo to tak:
Niektore wartosci "message" zaczynaja sie od stringu PROCESSED, i w
zasadzie te rekordy sa dla nas najwazniejsze. Jesli zaczynaja sie od
czegos innego to tego typu rekordy moga byc potrzebne jesli zwykly
rekord z "PROCESSED" jest niewystarczajacy. A wiec, ktos tu napisal
skrypt w PHP ktory wyszukuje 5000 pierwszych rekordow ktorych message
zaczyna sie od "PROCESSED" i przerzuca je do innej tabeli. Do nowej
tabeli zabieramy tylko pola: source_ip, date_time, tag,message.
Czy jest to dobre rozwiazanie? Czy opierac dalej wszystko na skrypcie
PHP?
Dziekuje za pomoc
Michal
Maly update. Obecnie w tabeli mam 39 milionow rekordow. Zakladam index
na poszczegolne pola i kazda operacja trwa kilkanascie minut.
Pozdrawiam
M.
>Maly update. Obecnie w tabeli mam 39 milionow rekordow. Zakladam index
>na poszczegolne pola i kazda operacja trwa kilkanascie minut.
Ale nadal nie poda�e� jak wygl�daja zapytania, kt�re wykonujesz. Przecie� nikt
tu nie b�dzie zgadywa�.
> Ale nadal nie podałeś jak wyglądaja zapytania, które wykonujesz. Przecież nikt
> tu nie będzie zgadywał.
Na przyklad tak:
SELECT * FROM syslog WHERE
message LIKE "PROCESSED%domain.com%"
AND date_time between X and Y
Pozdrawiam
M.
Panie, ten like to bez indeksow to zajedzie wszystko ;/
czy te wiadomosci z PROCESSED na poczatku charakteryzuje jakies inne
severity?
odpal sobie explain SELECT * FROM syslog WHERE message LIKE ....
i zobacz co Ci mowi - mowi duzo ;)
--
Michał /sn1p3r/ Gruchała
na ktore zalozyles?
--
Michał /sn1p3r/ Gruchała
>Na przyklad tak:
>
>SELECT * FROM syslog WHERE
>message LIKE "PROCESSED%domain.com%"
>AND date_time between X and Y
Tak jak Micha� pisa� - najpierw doprowad� tabel� do porz�dku (normalizacja).
Przede wszystkim daty trzymamy w dedykowanym typie pola a nie VARCHAR.
My�la�em, �e to tylko taki straszak w r�nych artyku�ach czy ksi��kach, ale
niestety zdarza si� to w rzeczywisto�ci.
> na ktore zalozyles?
Zmienilem typ date_time to datetime i zalozylem index
source_ip - zalozylem index
message - zazwyczaj jest dosc krotki wiec wlasnie zmieniam type z
longtext na text, nie wiem czy to duzo pomoze ale sprobuje. Potem bede
chcial dodac index na message
Po zalozeniu indexu na te dwa powyzsze, sortowanie smiga bardzo
szybko. Jeszcze tylko message...
Dziekuje
M.
zastan�w si�, czy nie warto rozdzieli� przedrostk�w i nazwy domen. je�li
domeny maj� r�ne przedrostki tak, �e ka�dy z nich stanowi rozs�dny
fragment wszystkich rekord�w to zastanawia�bym si� kilkoma partycjami po
przedrostku. baza sama dba�aby o przydzielenie rekordu do partycji a
zapytania odwo�ywa�oby si� tylko do jednej partycji, tu np. PROCESSED.
dodatkowo separuj�c przedrostek od domeny mo�esz za�o�y� indeks na
kolumnie z domen� i w zapytaniu u�ywa� r�wno�ci zamiast like.
prawdopodobnie by�by to indeks do�� selektywny chocia� nie znam
rozproszenia nazw domen w tym syslogu.
je�li PROCESSED stanowi bardzo liczn� grup� wszystkich rekord�w to
partycjonowanie po przedrostku mo�e nie mie� sensu.
nie jestem pewny, czy indeks by�by u�ywany gdy to pole jest varcharem i
czy nie nale�a�oby ustali� pola o sta�ym rozmiarze.
drugi warunek w zapytaniu r�wnie� jest podatny na partycjonowanie, ale
pole manewru jest wi�ksze. w zale�no�ci od natury between X and Y mo�esz
rozwa�y� rozdzielenie date_time na cze�� daty i czasu, i partycjonowa�
po woluminie "datowym" a w ramach tego po odpowiednio dobranym woluminie
czasowym. przeanalizuj czy warunek between X and Y daje siďż˝ zapisaďż˝ tak,
aby baza mog�a wykorzysta� ewentualne partycje.
to tyle na szybko.
geos
> Tak jak Michał pisał - najpierw doprowadź tabelę do porządku (normalizacja).
> Przede wszystkim daty trzymamy w dedykowanym typie pola a nie VARCHAR.
> Myślałem, że to tylko taki straszak w różnych artykułach czy książkach, ale
> niestety zdarza się to w rzeczywistości.
Z poczatku nie zauwazylem ze date trzymaja w varchar, to juz
zmienione. Co oznacza pojecie normalizacji?
Dziekuje
M.
> Panie, ten like to bez indeksow to zajedzie wszystko ;/
> czy te wiadomosci z PROCESSED na poczatku charakteryzuje jakies inne
> severity?
Jeszcze nie wiem. Kazde polecenie zajmuje okolo 30 minut :(
> odpal sobie explain SELECT * FROM syslog WHERE message LIKE ....
> i zobacz co Ci mowi - mowi duzo ;)
SELECT * FROM syslog WHERE message LIKE "PROCESSED%" ?? Czy oto
chodzi?
M.
niedopowiedzenie: przez "to pole jest varcharem" mam na my�li pole
domeny bez przedrostka.
geos
> Co oznacza pojecie normalizacji?
Tylko nie pisz prosze, ze ktos Ci za to wszystko placi :/
--
pozdrawiam
Norbert
tu masz proste przyk�ady:
http://www.zie.pg.gda.pl/md/bazy_danych/przyklady_normalizacja.pdf
http://www.drivver.webpark.pl/nbd.htm
a tu teoriďż˝:
http://en.wikipedia.org/wiki/Database_normalization
geos
dodaj explain przed zapytaniem - mysql Ci powie jakby to zapytanie wykonal -
czy uzyje indeksow, czy zrobi filesort i tak dalej
--
Michał /sn1p3r/ Gruchała
Osobi�cie przed za�o�eniem indeksu na msg przeanalizowa�bym ilo��
dopuszczalnych rodzaj�w msg. Zrobi�bym kolumn� typu int kt�ra zawiera�a
by id rodzaju komunikatu i zrobi�bym sobie relacje z jak�� prost� tabel�
typ�w. Pami�taj te� i� �le przemy�lany indeks mo�e zabi� baz�.
zapytanie w stylu select * from log where msg_kind= 1
zwr�ci�o by np wyst�pienia kernel panic.
> source_ip - zalozylem index
Tu tez zmien typ. Nie wiem jak w mysqlu, ale zazwyczaj na ipki jest albo
specjalizowany typ danych, albo w ostatecznosci ipv4 do 32bit inta mozna
wrzucic.
--
Jaroslaw "jaros" Berezowski
> zastanów się, czy nie warto rozdzielić przedrostków i nazwy domen. jeśli
> domeny mają różne przedrostki tak, że każdy z nich stanowi rozsądny
> fragment wszystkich rekordów to zastanawiałbym się kilkoma partycjami po
> przedrostku. baza sama dbałaby o przydzielenie rekordu do partycji a
> zapytania odwoływałoby się tylko do jednej partycji, tu np. PROCESSED.
A jakbym partycjonowal po source_ip? PO zalozeniu indexu na to pole
cardinality = 14.
> jeśli PROCESSED stanowi bardzo liczną grupę wszystkich rekordów to
> partycjonowanie po przedrostku może nie mieć sensu.
PROCESSED stanowi jakies 10% wszystkich rekordow.
> drugi warunek w zapytaniu również jest podatny na partycjonowanie, ale
> pole manewru jest większe. w zależności od natury between X and Y możesz
> rozważyć rozdzielenie date_time na cześć daty i czasu, i partycjonować
> po woluminie "datowym" a w ramach tego po odpowiednio dobranym woluminie
> czasowym. przeanalizuj czy warunek between X and Y daje się zapisać tak,
> aby baza mogła wykorzystać ewentualne partycje.
Czy jesli bede partycjonowal w ten sposob to przyspieszy to
wyszukiwanie rekordow "PROCESSED%" ?
M.
> zastanów się, czy nie warto rozdzielić przedrostków i nazwy domen. jeśli
> domeny mają różne przedrostki tak, że każdy z nich stanowi rozsądny
> fragment wszystkich rekordów to zastanawiałbym się kilkoma partycjami po
> przedrostku. baza sama dbałaby o przydzielenie rekordu do partycji a
> zapytania odwoływałoby się tylko do jednej partycji, tu np. PROCESSED.
Wcielo mi gdzies odpowiedz ktora do Ciebie napisalem, wiec moze
jeszcze raz:
PROCESSED to tylko jakeis 10% wszystkich rekordow. Myslalem o tym zeby
partycjonowac po IP, ktore po dodaniu indexu cardinality ma 14.
> drugi warunek w zapytaniu również jest podatny na partycjonowanie, ale
> pole manewru jest większe. w zależności od natury between X and Y możesz
> rozważyć rozdzielenie date_time na cześć daty i czasu, i partycjonować
> po woluminie "datowym" a w ramach tego po odpowiednio dobranym woluminie
> czasowym. przeanalizuj czy warunek between X and Y daje się zapisać tak,
> aby baza mogła wykorzystać ewentualne partycje.
Data tez wchodzi w gre. Postaram sie znormalizowac tabele jak tylko
sie da i dodam partycjonowanie.
Dziekuje
M
Znow maly updejt, okazalo sie ze podczas moich ostatnich prac,
dodawanie nowych rekordow przez syslog bylo wylaczone. Dzis kiedy
przyszedlem do pracy to wlaczylismy je na nowo. Problem jest taki ze,
to chyba zarzyna caly serwer. Odkad to wlaczylismy, nie moge utrzymac
sie na zdalnym pulpicie przez dluzej niz 5 minut i Phpmyadmin po
prostu sie zamraza podczas prostego przegladania struktury tabel.
M.
Haha, pracuje tu za darmo :) Juz wiem, a wiec uzywalem normalizacji
juz od dawna.
Pozdrawiam
M.
id select_type table type possible_keys key key_len ref rows
Extra
1 SIMPLE syslog ALL NULL NULL NULL NULL 40126719 Using where
M.
Dziekuje, wywalilem z tabeli to co niepotrzebne. Teraz wyglada to tak:
ID source_ip date_time tag message
1 xx.xx.xxx.xxx 2010-05-24 10:39:47 postfix/smtp[1234] Verified:
subject_CN=*.psmtp.com, issuer=VeriSign ...
Indexy sa na wszystkich polach procz tag. Zmienilem typ bazy na
innodb. Zastanawiam sie nad przeniesieniem takich samych wartosci do
osobnych tabel. Adresy IP i tagi powtarzaja sie bardzo czesto ale czy
to ma sens? Czy nie lepiej spartycjonowac wszystko po numerze dnia?
Czyli stworzyc 31 partycji?
Pozdrawiam
M.
imho jest to bardzo dobra liczebno�� na partycj�. pozosta�e partycje
mo�esz zdefiniowa� na podstawie kryteri�w zapyta� dodatkowych dla
klienta odpytuj�cych baz� o rekordy z innymi warto�ciami tego pola.
> A jakbym partycjonowal po source_ip? PO zalozeniu indexu na to pole
> cardinality = 14.
zr�nicowanie warto�ci jest raczej niskie. imho nie ma sensu zak�ada�
klasycznego indeksu b-tree. alternatywnie m�g�by by� indeks
binarny/bitmapowy, ale nie wiem, czy 14 to ju� nie za du�o dla niego.
poszukaj te� dok�adniejszych informacji o tym indeksie poniewa� o ile
dobrze pami�tam stwarza problemy przy insertach, co (je�li jest prawd�)
przy 23/s ci�g�ych danych mo�e by� problemem. nie wiem te�, czy mysql
obs�uguje ten typ indeksu.
poniewa� liczebno�� wynosi 14 to bardzo dobrze nadaje si� do
zdefiniowania dodatkowych kryteri�w i wykorzystaniu ich do utworzenia
partycji drugorz�dnych w ramach podzia�u pierwszego.
>> drugi warunek w zapytaniu r�wnie� jest podatny na partycjonowanie, ale
>> pole manewru jest wi�ksze. w zale�no�ci od natury between X and Y mo�esz
>> rozwa�y� rozdzielenie date_time na cze�� daty i czasu, i partycjonowa�
>> po woluminie "datowym" a w ramach tego po odpowiednio dobranym woluminie
>> czasowym. przeanalizuj czy warunek between X and Y daje siďż˝ zapisaďż˝ tak,
>> aby baza mog�a wykorzysta� ewentualne partycje.
>
> Czy jesli bede partycjonowal w ten sposob to przyspieszy to
> wyszukiwanie rekordow "PROCESSED%" ?
partycjonowanie po dacie/czasie b�dzie mia�o wp�yw na drugi z warunk�w.
jednak jak si� nad nim zastanawiam w kontek�cie sposobu dodawania
rekord�w i samego zapytania to mam nast�puj�ce przemy�lenia. o ile
dobrze zrozumia�em jest to syslog. rekordy dostarczane do tabeli w
czasie rzeczywistym i umieszczane w niej -- z grubsza -- zgodnie z
dat�/czasem w�a�nie. poniewa� warunek w zapytaniu jest zakresowy
(between X and Y) to rekordy i tak b�d� odczytywane z tabeli
"ciurkiem-zgodnie-z-czasem" co wi��e si� z niewielk� liczb� operacji
I/O. partycjonowanie po dacie/czasie mo�e wi�c nie wnie�� du�ego zysku.
podsumowuj�c: partycjonowanie po polu "PROCESSED" zmniejszy liczb�
rekord�w poddawanych obr�bce podczas odpytywania do 10% dla podanego
zapytania. jednocze�nie 90% sp�ywaj�cych rekord�w baza b�dzie umieszcza�
w ich w�asnych partycjach. partycjonowanie po IP (lub ich grupach) dalej
zmniejszy liczb� rekord�w je�li warunek b�dzie te� na IP.
co do partycjonowania po dacie/czasie zysk mo�e nie by� du�y. by� mo�e
lepiej jest rozdzieli� timestamp na dat� i czas, i za�o�y� klasyczny
indeks na dat�. warunek na dat� b�dzie d��y� do statusu bardzo
selektywnego kryterium wraz z zape�nianiem tabeli. je�li wi�c warunek
zapytania mo�esz przepisa� na ..and date = X (lub between X and Y) a do
tego doda� warunek na czas to by� mo�e tak b�dzie lepiej ni� partycjonowa�.
og�lnie uwagi ch�opak�w z tego w�tku s� bardzo cenne. nie ma gotowego
przepisu (szczeg�lnie tak na odleg�o��). czasami jedno rozwi�zanie
sprawdza si� lepiej o tego, kt�re sprawdza�o si� dobrze gdzie indziej.
trzeba troch� potestowa�. unikaj raczej zak�adania "na pa��" indeks�w.
przy takiej liczbie danych mog� bardzo puchn��, a poniewa� s� to
struktury zwarte mo�e wyst�pi� konkurowanie o dost�p do nich. indeksy
mog� r�wnie� by� partycjonowane, ale nie wiem czy mysql je obs�uguje.
na tej grupie jest sporo wymiataczy bazodanowych, mo�e kto� si� jeszcze
odezwie i doda od siebie uwagi (na co r�wnie� licz�, trzeba uczy� si�
ca�e �ycie)
pozdrawiam,
geos
A jak dodac partycje na tego rodzaju warunek. Jak dodajemy partycje
tego rodzaju i jakiego typu?
Przykladowy wiersz:
ID source_ip date_time tag message
23 96.xxx.xx.xxx 2010-05-24 10:39:48 coder004s[5360] PROCESSED|encode|
zixnet|FROM:xx@ddd...
> na tej grupie jest sporo wymiataczy bazodanowych, może ktoś się jeszcze
> odezwie i doda od siebie uwagi (na co również liczę, trzeba uczyć się
> całe życie)
Bardzo dziekuje za wyczerpujaca odpowiedz
M.
tutaj znalaz�em sk�adni� CREATE TABLE w mysql:
http://dev.mysql.com/doc/refman/5.1/en/create-table.html
do partycjonowania interesuje Ci� wype�nienie cz�ci PARTITION
BY/SUBPARTITION BY. je�li si� zdecydujesz to prawdopodobnie w przypadku
pola "przedrostek" b�dzie to partycjonowanie listowe. tutaj znalaz�em
dobrze opisane przyk�ady, znajdziesz analogi� do takiego przypadku,
fajnie jest to opisane z tego co widzďż˝:
http://dev.mysql.com/tech-resources/articles/mysql_5.1_partitions.html
pozdrawiam,
geos
Plusy:
+ Dodajesz rekordy jednym ciągiem - możesz na ten czas wyłączyć indeksy
i włączyć je po całej operacji
+ Duże możliwości optymalizacji na etapie dodawania rekordów - możesz
dodawać tylko wybrane, możesz robić jakieś analizy - ja miałem oddzielną
tabelę ze statystyka dobową, którą mi skrypt zliczał
+ Przez cały dzień baza jest tylko odczytywana
Minusy
- nie masz dostępu do zapisów z bieżącego dnia
Jeśli ten minus jest do zaakceptowania - IMO warto.
Ew. możesz to robić w cyklach godzinowych, a nie dobowych.
--
Paweł Muszyński
Skateshop http://sklep.e-street.pl
Pozdrawiam
J.
tzn. tych po "select" czy tych po "where" ?
> Indexy sa na wszystkich polach procz tag.
Hmm pisz prosze po naszemu "indeks". To mi zgrzyta w oczach tak jak kotly
na "pellets" Kostrzewy.
A co do tego na czym je zalozyc - odpowiedz sobeio na pytanie, po czym
chcesz filtrowac, ew. agregowac.
> Zmienilem typ bazy na innodb.
> Zastanawiam sie nad przeniesieniem takich samych wartosci do osobnych
> tabel. Adresy IP i tagi powtarzaja sie bardzo czesto ale czy to ma sens?
Jezeli "bardzo czesto" oznacza bardzo czesto, to ma.
--
Jaroslaw "jaros" Berezowski
napisz prosz� jak finalnie wygl�da implementacja rozwi�zania i jak si�
sprawdza.
pozdrawiam,
geos
Pewnie, dzieki za pomoc.
M.
where
Ale mozna zastanowic sie, czy do tego where nie dorzucic paru jego
kumpli z select. Zwlaszcza, jak do kazdego zapytania ida razem...
Przyklad:
select imie, nazwisko
...
where nazwisko= 'Kowalski'
Pozdro
Maseł
wreszcie pad�a ta sugestia w odpowiedzi na to lekko podchwytliwe pytanie :)
pozdrawiam,
geos
Jaki ma być sens wrzucania do indeksu pól z klauzuli select?
> wreszcie pad�a ta sugestia w odpowiedzi na to lekko podchwytliwe pytanie :)
Bo systemy z indeksem na kazdej mozliwej kolumnie juz widzialem...
Pozdro
Maseďż˝
Opiekuje się podobną bazą z logami gdzie są miliardy wierszy i działa.
- indeksy muszą mieścić się w pamięci.
- pola tekstowe trzymasz w oddzielnej tabeli
- archiwizujesz dane starsze niż x dni
- do wyszukiwanie po polach tekstowych dodajesz sphinxa,solr, ...