Autor Zpráva
Kcko
Profil
Vzhledem k minulemu prispevku, jsem si prosel svuj web a nasel nekolik veci, ktere vypadaji zdanlive jednodusse ale provadeji se narocne a nevim jak vyladit ...



1/

Tento dotaz vybere 50 prispevku z shoutboxu , vzdy nejnovejsi ( samozrejme tam mam strankovani takze vzdycky $stranka * 50 )
Na sloupci datum mam index. Dotaz trva temer jednu vterinu, jelikoz mam v DB 30 000 zaznamu. Kdybych to neradil podle data a nechal to byt tak je to za 0.0024

Seradit opacne ale potrebuji.

 select SQL_CALC_FOUND_ROWS *, UNIX_TIMESTAMP(datum) unix from shoutbox order by datum DESC LIMIT $str->l, $str->rows 



EXPLAIN vykaze
1  	SIMPLE  	shoutbox  	ALL  	NULL  	NULL  	NULL  	NULL  	30271  	Using filesort


Jak toto optimalizovat?

2/ Tento dotaz je spise vseobecny, pouzivam robustnejsi dotazy ktere filtruji pomoci WHERE nejcasteji na datum ... napr

 WHERE YEAR(datum) = 2007 AND MONTH(datum) = 6 

Index samozrejme na datumu mam, ale nepouzije se, prochazi se cela tabulka protoze mysql asi neumi pouzivat indexy na tyto fce

Jak se to ladi? Nikde zadny poradny clanek, budu se snad muset poohlidnout po jine DB ?
Kajman_
Profil *
Co udělat index na "datum desc"? (edit... tak zrada u mysql je desc podle manuálu bez užitku)

Trvá to dlouho i bez SQL_CALC_FOUND_ROWS?
Mastodont
Profil
Index samozrejme na datumu mam, ale nepouzije se

To je logické, protože index máš na sloupci a v dotazu na tom sloupci voláš funkce YEAR a MONTH. Buď udělej indexy pro Year(datum) a Month(datum) nebo ve WHERE používej konkrétní data (1. 6. 2007 až 30. 6. 2007).
Kcko
Profil
Kajman_
Trva ... , zkousel jsem dat DESC, je to porad to same

Mastodont
Mysql to umoznuje?

 ALTER TABLE `vysledky` ADD INDEX ( YEAR(`datum`) )  


Tento zapis mi nefunguje, jinak nevim jak bych to mel zapsat.
Kajman_
Profil *
1/
A jakého typu ten index je?

2/
Mysql to umoznuje?

Myslím, že ne. Např. oracle či pgsql to umí.

V mysql se to může řešit přidáním sloupečků rok a mesic, které budou jen pro rychlé vyhledávání, ale lepší je řešení, jak píše Mastodont, stačí použít where s intervalem (převést hodnoty na formát sloupečku a se sloupečkem neprovádět žádné operace).
Kcko
Profil
Kajman_
1/ nerozumim moc otazce ... jednoduchy index na 1 sloupcecku typu DATETIME
2/ Jasne, jenze ja si nemuzu dovolit prepisovat pulku webu ( ty nejhorsi veci kesuju ci prepocitam nekolikrat za den pomoci CRONU) , do budoucna s tim pocitat budu ale prijde mi to trosku nesmyslne psat misto

YEAR(datum) = 2007 psat BETWEEN(datum) '2007-01-01' AND ...


vypada to ze Mysql u me asi konci a podivam se co umi PgSQL
kOsTEj
Profil
Presne jak rika Kajman_.

Taky jsem se docetl, ze "DESC" ve vytvoreni indexu je bez uzitku, protoze je to akorat priprava pro nakou vyssi verzi a ted se ignoruje.

Tedy reseni, ktere me se libi a asi jinac to udelat nejde, je vytvoreni vlastniho sloupecku, kterej bude mit "inverzni" datum a ten indexovat.
Odkaz
Kajman_
Profil *
1/ indexy můžou být různého typu.. hash, btree

2/ ale prijde mi to trosku nesmyslne psat misto

je výkonostní rozdíl mez podmínkami
sloupecek-5=10
sloupecek=15
MzM
Profil
vyrob si sloupeček year.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: