Autor Zpráva
ng9
Profil
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
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ěž...

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
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
Předpokladem je, aby v ID nebyly mezery (smazané záznamy), jinak by to mohlo vybrat méně záznamů.

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
Kajman
Profil
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.

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:

0