Autor Zpráva
martin.
Profil *
Ahoj,

tento příspěvek jsem posílal Jakubovi Vránovi, ale zeptám se i tady. Potřeboval bych pomoc s následujícím dotazem. Z článku od Jakuba vyplývá, že je nejlepší, pokud data databáze sama netřídí a neukládá do tempu (Using temporary při EXPLAIN).

Nevím jakým způsobem bych měl t třídění odstranit, jestli to je skutečně nutné a pomohlo by to, případně jak byste upravili dotaz a volili indexy? Rád se přiučím. Tady je:

---

SELECT u.id, u.nick, u.barva, UNIX_TIMESTAMP(u.datum_registrace) AS datum_registrace,
z.text, z.datum, f.soubor AS fotka FROM uzivatele u LEFT JOIN zpravy z ON (z.uzivatel_id = u.id) LEFT JOIN fotky f ON (f.id = u.fotka_id) WHERE z.text IS NOT NULL ORDER BY z.datum DESC

---

U takových typů dotazů nikdy nevím jaký index je nejvhodnější. Mám indexy v tabulce zpravy na: "uzivatel_id", dalsi index na "datum", jenže to je asi špatně... Jsem v těch indexech ztracený, prosím o pomoc.

Díky
Kajman_
Profil *
Na tabulce zprávy by byl dobrý složený index (uzivatel_id,datum desc), ale v mysql nejdou vytvářet indexy v opačném pořadí (občas se používá sloupeček navíc datum_reverse, kde jsou datumy převedeny tak, aby starší byly menší, pak by mohla snad už mysql index použít na řazení). Zkuste si oddělat desc, jestli to bude svižnější, mohl by to být popisovaný problém.

A proč máte left join na zpravy, když máte potom z.text is not null, takže to musí vyhodit ty uživetele, kteří nemají zprávu? Myslím, že left join bude mít trošku vyšší režii než obyčejný join.
joe
Profil
Kajman_
Řeším teď něco podobného, tak se rovnou zeptám tady. Když nemůžu vytvořit index (id, datum desc), jak zapíšu převedené datum, tak abych to mohl mít? Tedy jakým způsobem pak do takového sloupce tu hodnotu ukládat.
Funguje tento "trik" i na sloupec typu datetime nebo jen na timestamp?
Kajman_
Profil *
joe
Na timestamp řešení tu byl nedávno odkaz
http://www.igvita.com/2007/08/20/pseudo-reverse-indexes-in-mysql/

Datetime je většího rozsahu, tak by se to muselo převádět asi trošku jinak (třeba na string).

martin.
A on by vlastně pro ten dotaz měl být asi první sloupeček v indexu ten datum, až pak id (nebo nechat ty dva jednoduché indexy, jak to máte teď - novější verze od nějaké 5.0.x to už umí použít). Ze selectu určitě vyhodit to první left a možná vynutit chtěný index přes use index.

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