Zdravim. Mel bych mensi dotaz. Resim tento problem:
Kazdych 5 minut se do jedne tabulky ulozi data(cca 100 radku). tabulka ma tyto sloupce. in bytes,out bytes,in packets,out packets,timestamp. kdyz pak potrebuju tyto polozky sum() za celej mesic, tak to trva rekneme trosku hafo dlouho. ale pokud zapnu indexovani teto tabulky, tak dojde k tomu z pridavani je tak pomaly, ze za tech 5 minut nez se zacne pridavat znova, se nestihnout udelat ani indexy, takze disk vali furt. Jaky doporucujete reseni? da se v mysql udelat neco jako vytvoreni indexu jenom na cast polozek a zbytek aby dohledaval rucne? tozn. ze bych v noci udelal index cele tabulky, a pres den by se index nedelal na nove polozky.
Da se napr. vytvorit novou tabulku s indexama
a jednou za urc.cas.jedn. tam zaznamy zkopirovat/presunout, coz je z hlediska db teorie
naprosty hnus ;-)
Taky lze puvodni tabulku mit jako temporary
typu HEAP (viz http://www.mysql.com/doc/en/HEAP.html)
Do trvale tabulky pak ukladat pouze data prechroustana z HEAPu.
V první řadě se mi nezdá, že indexování popsaných 100 položek by stroj dokázalo vytížit na 5 minut. To musí být v nepořádku ještě něco jiného.
Ale hlavně je důležité rozmyslet si, nad kterými sloupci vůbec index nasadím. V příspěvku je uvedeno pouze "zapnu indexování tabulky". Jestli to znamená, že je vytvořen index nad všemi sloupci, je tento index v podstatě zbytečný. Jestli je vytvořen nad sloupcem timestamp, není také moc užitečný, protože když pokládám dotaz např. SELECT EXTRACT(YEAR_MONTH FROM timestamp) AS year_month, SUM(in_bytes) FROM data GROUP BY year_month, index se stejně nemůže použít, protože se sloupcem nepracuji přímo, ale přes funkci.
Správné řešení tedy vypadá tak, že se do tabulky přidá ještě sloupec year_month, nad kterým bude jediný index a který se bude počítat už v době vkládání záznamů.
Pokud vám však stačí údaje jako počet položek, jejich součet a průměr po měsících, je lepší primární data vůbec neukládat a jenom si v malé tabulce aktualizovat sledované hodnoty.