Autor | Zpráva | ||
---|---|---|---|
ng9 Profil |
#1 · Zasláno: 23. 12. 2011, 11:34:22 · Upravil/a: ng9
Zdravím,
můžete mi někdo poradit jestli a jak lze zefektivnit následující kód? Potřebuji z databáze vybrat posledních 20 záznamů. Kod který dělá to co má: select * from tabulka order by id desc limit 20 Takže nejdřív bych si zjistil poslední záznam přes max(id) a druhým dotazem zadal limit ve smyslu limit max(id)-20,20 ... ale to jsou dva dotazy, jde to zapsat jedním? Ve smyslu select *, max(id) as posledni from tabulka limit posledni-20,20 děkuji Tak jsem si nepřímo pomohl nastavením "query-cache-type = 1" - třeba to někomu pomůže, takže se mi ten dotaz nebude načítat stálo nanovo. Kdyby někdo věděl jak ale ten dotaz udělat méně náročný, rád si to řešení vyslechnu. |
||
DJ Miky Profil |
#2 · Zasláno: 23. 12. 2011, 13:47:57 · Upravil/a: DJ Miky
Jde to udělat poddotazem ve WHERE (což jsou vlastně také dva dotazy, ale oba pro databázi poměrně jednoduché):
SELECT * FROM tabulka WHERE id > (SELECT MAX(id) - 20 FROM tabulka) ORDER BY id DESC Dalo by se to vyřešit zvýšením počtu řádků třeba na 50 a omezením pomocí LIMIT (rozdíl v náročnosti už bude zanedbatelný): SELECT * FROM tabulka WHERE id > (SELECT MAX(id) - 50 FROM tabulka) ORDER BY id DESC LIMIT 20 |
||
Časová prodleva: 3 dny
|
|||
Kajman Profil |
#3 · Zasláno: 26. 12. 2011, 15:06:00
ng9:
„Problém je, že když tabulka má miliony záznamů tak databáze nejdřív všechny záznamy musí setřídit což je zbytečná zátěž...“ Kdepak, na sloupci s indexem (což u id bývá) není potřeba řadit vše. Jak dlouho to trvá na těch milionech záznamů? Mělo by to být v cuku letu. |
||
Časová prodleva: 14 let
|
0