Autor | Zpráva | ||
---|---|---|---|
Kcko Profil |
#1 · Zasláno: 8. 6. 2008, 11:22:28
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 |
#3 · Zasláno: 8. 6. 2008, 12:10:04
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 |
#4 · Zasláno: 8. 6. 2008, 12:49:53
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 * |
#5 · Zasláno: 8. 6. 2008, 13:10:42
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 |
#6 · Zasláno: 8. 6. 2008, 13:14:19
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 |
#7 · Zasláno: 8. 6. 2008, 13:21:15 · Upravil/a: kOsTEj
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 * |
#8 · Zasláno: 8. 6. 2008, 13:23:38
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 |
#9 · Zasláno: 10. 6. 2008, 14:58:44
vyrob si sloupeček year.
|
||
Časová prodleva: 16 let
|
0