Autor Zpráva
Jam
Profil *
Ahoj,

chtěl bych se zeptat jestli je nějaká možnost zrychlit následující dotaz do databáze.
V tabulce zahraniční je 130 000 řádků a v tabulce lyrics zhruba 1200 a stále další přidávám.
Dotaz:
"SELECT zk.Contentgroup, zk.Title, te.nazev\n"
    . "FROM zahranicni AS zk\n"
    . "LEFT JOIN lyrics AS te ON zk.Title = te.nazev WHERE te.nazev IS NULL\n"
    . "GROUP BY zk.Title LIMIT 1
    "



PS: tento dotaz trvá někdy i 30 vteřin
mimochodec
Profil
Doporučil bych joinovat přes číselný sloupec místo textového. A taky použít ten LIMIT 1 dřív než se to všechno přijoinuje a zgroupuje.
Jam
Profil *
Přes číselný to bohužel nepůjde. Ty tabulky maji společný jen ty sloupce které jsou v selectu. S tím limitem je to myšleno jak?
mimochodec
Profil
Jam:
Ty tabulky maji společný jen ty sloupce které jsou v selectu.
Pak jde o špatný návrh databáze, který se ti tímto způsobem vymstil. Jestli dobře koukám, jde o nějakou muziku a texty písniček joinuješ přes název skladby. Tohle ti nikdy rychle nepojede.

S tím limitem je to myšleno jak?
Spojuješ dvě tabulky přes textový sloupec, což je extrémně náročné. Ten dotaz vytvoří 1200 řádků, pak provede GROUP (opět nad textovým sloupcem, zase hodně špatně) a pak z těch 1200 vytvořených řádků vybere jeden. Když ten limit poštveš na jednu z těch tabulek ještě před joinováním, tu chybu tím neopravíš, ale času ušetříš dost, protože budeš joinovat jen jeden řádek.

Jak na to, přesně nevím. Zkusil bych něco jako

SELECT * 
FROM (SELECT id, col_a, col_b FROM tbl_a GROUP BY neco LIMIT 1) a_work
LEFT JOIN tbl_b ON a_work.id = tbl_b.aid

Ale nemám to vyzkoušeno. A velmi pravděpodobně se zásahům do struktury stejně nevyhneš.
Jam
Profil *
mimochodec:
Díky upravil jsem tabulky a už to jede přes číselný to je jinej fofr ;-)

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: