Autor | Zpráva | ||
---|---|---|---|
ferda999 Profil |
#1 · Zasláno: 6. 10. 2021, 06:54:16 · Upravil/a: Moderátor (editace znemožněna) 6. 10. 2021, 17:14:48
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 |
#2 · Zasláno: 6. 10. 2021, 10:03:07
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))); 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 |
#3 · Zasláno: 6. 10. 2021, 12:34:17
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 |
#4 · Zasláno: 6. 10. 2021, 14:21:11
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é.
|
||
Časová prodleva: 4 roky
|
0