Autor Zpráva
ferda999
Profil
Moderátor Keeehi: Vkládej prosím kódy mezi značky [pre] a [/pre] (stačí kliknout na ).
Zdravím, nejsem v tomto moc zběhlý, prosím, poradil by někdo, jak upravit tento select, aby byl ryhlejší...

SELECT forum.id,forum.tema,data.jmeno AS titulek,forum.text,forum.datum,forum.uid, 
CASE WHEN (forum.uid = 0) THEN forum.uname ELSE IFNULL(uzivatele.jmeno,forum.uname) END AS autor,uzivatele.email 
FROM forum 
LEFT JOIN data ON (LOWER(forum.tema) = LOWER(data.pid)) 
LEFT JOIN uzivatele ON (forum.uid = uzivatele.uid)  
ORDER BY id DESC LIMIT 0,10 

TABULKA: forum id int(11), uid int(11), umame char(30),tema char(20), text text, datum datetime; INDEXY: id primary, index uid, index tema
TABULKA: data pid char(20), jmeno char(60); INDEXY: pid primary
TABULKA: uzivatele uid int(11), jmeno char(30), email char(30); INDEXY: uid primary

Execution plan:
table:forum type:ALL possible_keys: key: Extra:Using temporary, Using filesort
table: data type:ALL possible_keys: key: Extra:Using where, Using join buffer
table: uzivatele type:eq_ref possible_keys:PRIMARY;uid key:PRIMARY Extra:

Moc děkuji za případnou pomoc
Kajman
Profil
Pokud máte novější verzi mysql nebo mariadb, půjde udělat index nad výsledkem funkce. Tedy něco jako

ALTER TABLE data ADD INDEX ((LOWER(pid)));
ALTER TABLE forum ADD INDEX ((LOWER(tema)));
viz
dev.mysql.com/doc/refman/8.0/en/create-index.html#create-index-functional-key-parts


Možná by pak ještě pomohlo omezení hlavní tabulky v poddotaze, ale tím si nejsem jistý. To je potřeba změřit.

SELECT forum.id,
       forum.tema,
       data.jmeno AS titulek,
       forum.text,
       forum.datum,
       forum.uid,
       CASE
         WHEN ( forum.uid = 0 ) THEN forum.uname
         ELSE Ifnull(uzivatele.jmeno, forum.uname)
       end        AS autor,
       uzivatele.email
FROM   (SELECT f.*
        FROM   forum f
        ORDER  BY id DESC
        LIMIT  0, 10) forum
       LEFT JOIN data
              ON ( Lower(forum.tema) = Lower(data.pid) )
       LEFT JOIN uzivatele
              ON ( forum.uid = uzivatele.uid )
ORDER  BY forum.id DESC
ferda999
Profil
Kajman:
Zdravím, moc děkuji za pomoc.

Na základě Vaší rady zjišťuji, že největší brzdou v selectu je funkce LOWER. Hodnoty uvedených položek naštěstí mohu ošetřit již při vkládání, takže tato funkce odpadne a select je výrazně rychlejší.

Po odstranění fcí LOWER je

Execution plan:
table: forum type:index possible_keys: key:PRIMARY Extra:Backward index scan
table: data type:eq_ref possible_keys:PRIMARY key:PRIMARY Extra:
table: uzivatele type:eq_ref possible_keys:PRIMARY key:PRIMARY Extra:

Lze ještě dle tohoto planu něco optimalizovat?
Kajman
Profil
Nepřijde mi, je to jednoduchý dotaz a pro omezení 10 nejnovější i pro spojení na jiné tabulky používá primární klíče. Mělo by to být svižné.

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