Autor Zpráva
it47
Profil
Ahojte,

mam tabulku, kde su clanky a je tam stlpec, kedy ma clanok byt publikovany. A teraz chcem vypisat 3 najnovsie clanky (podla datum_zaciatok)

SELECT m.* FROM magazin m WHERE NOW() >= m.datum_zaciatok ORDER by m.datum_zaciatok DESC LIMIT 3

Index mam vytvoreny na datum_zaciatok.

Avsak cez EXPLAIN vidim, ze sa prehladavaju aj tak vsetky riadky. Preco?

Ak by som vyhodil podmienku NOW() >= m.datum_zaciatok tak uz sa prehladaju iba 3 riadky, ale zase ono by to vypisalo aj clanky, ktore maju byt zverejnene v buducnosti a to nechceme.

Vopred dakujem velmi pekne za akekolvek rady.

it47
Kajman
Profil
Sloupec je typu date nebo datetime?
it47
Profil
Kajman:
datetime

jeden clanok sa zverejni o 8:00 rano, dalsi o 11:00 atd. ;-))
Kajman
Profil
Ukazuje explain použití indexu? A oproti verzi bez where je tam jen rozdíl v explain nebo i v rychlosti? Pokud je to stejně rychlé, tak není co zrychlovat.

Možná je to tak, že podmínce vyhoví téměř všechny řádky tabulky a proto vzhledem k limitu raději použije index pro řazení a od konce testuje, zda řádek vyhoví nebo ne (ale jen do doby, než najde tři vhodné).

Někdy se zase index nevyužije, když je v tabulce příliš málo záznamů a režie s indexem by byla náročnější než jednoduché projítí několika řádků.
it47
Profil
Kajman:
Dakujem pekne za vysvetlenie.

Takyto je vysledok EXPLAIN (tabulka ma 1092 riadkov):
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra 
1 | SIMPLE | m | range | datum_zaciatok | datum_zaciatok | 5 | NULL | 1091 | Using where

bez where je to efektivnejsie, lebo sa prehladavaju iba 3 riadky

1 | SIMPLE | m | index | NULL | datum_zaciatok | 5 | NULL | 3

Tak ako? Myslis, ze ten select sa da napisat efektivnejsie?

Vopred dakujem velmi pekne.
Kajman
Profil
Jaký je rozdíl v rychlosti?
it47
Profil
Kajman:
cas je takmer rovnaky, takze asi to bude ok? :)

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: