Autor Zpráva
MaK
Profil
Mám tabulku

CREATE TABLE t
(
id INTEGER PRIMARY KEY,
...
)


+ předpokládám, že primární klíč je index typu strom
+ předpokládám, že jiné indexy v tabulce neexistují
+ předpokládám, že se neuplatňují cache


1. SELECT * FROM t ORDER BY id ASC LIMIT 10
databáze procházi index a vezme prvních 10

2. SELECT * FROM t ORDER BY id ASC LIMIT 100,10
databáze procházi index, prvnich 100 položek v indexu 'mine-ignoruje' a nasledujících 10 vrátí

3. SELECT * FROM t WHERE nejake_podminka_na_dalsich_sloupcich ORDER BY id ASC LIMIT 100,10
databáze procházi index, postupně ověřuje platnost podminky a až nalezne 100 vyhovujících řádků, následujících 10 vyhovujících vrátí

Je patrné, že rychlost provedení bodů 2 a 3 je přímo závislá na offsetu (prvni parametr LIMITu).
Jinak řečeno, nejdříve probublá a prověří 100 řádku, které zahodí. Čím vyšší bude offset, tím bude trvat déle, než se dohrabe, k těm deseti co potřebuju.

Mýlil jsem se v některém tvrzení?
Jakým způsobem dosahnout konstantní rychlosti?

MaK
Kajman
Profil
Jestli použíje index, zjistíte v explain.

Myslím, že v bodu 3 se index nepoužije. Order se provede až na výsledek získaným díky where. Když by ta podmínka byla v having, tak by mysql nejspíše kontrolovala záznamy vzestupně dle id. Což však neznamená, že to bude ryhlejší. Využívá se to občas u podmínek, které jsou téměř vždy pravdivé.

Jakým způsobem dosahnout konstantní rychlosti?

Pro bod 2 asi díky dalšímu pomocnému sloupci se souvislými čísly a podmínkou
where sloupec between 101 and 110
MaK
Profil
Kajman:
Myslím, že v bodu 3 se index nepoužije. Order se provede až na výsledek získaným díky where. Když by ta podmínka byla v having, tak by mysql nejspíše kontrolovala záznamy vzestupně dle id. Což však neznamená, že to bude ryhlejší. Využívá se to občas u podmínek, které jsou téměř vždy pravdivé.

Pokud by nepouzil index, pak by prosel CELOU tabulku, pak order, pak limit? To mi, pri vsi ucte, nesedi. Ale rikate, ze je to jeste horsi nez jsem napsal. Jak z toho ven?

where sloupec between 101 and 110
where id between 101 and 110?
Kajman
Profil
MaK:
To mi, pri vsi ucte, nesedi.

Tak to opravdu nesedí. Vypadá to, že v případě, že na where podmínku nejde použít index, prochází se dotaz 3 podle Vašeho předpokladu.

where id between 101 and 110?

Nebude fungovat, pokud id nebude souvislá řada čísel začínajících jedničkou. Když např. smažete řádek s id 42, tak tato podmínka by dala jiné řádky než limit v dotazu 2.

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: