Autor | Zpráva | ||
---|---|---|---|
Jam Profil * |
#1 · Zasláno: 1. 3. 2015, 17:36:13 · Upravil/a: Jam
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 |
#2 · Zasláno: 1. 3. 2015, 17:46:54
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 * |
#3 · Zasláno: 1. 3. 2015, 17:51:48
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 * |
#5 · Zasláno: 1. 3. 2015, 18:17:00
mimochodec:
Díky upravil jsem tabulky a už to jede přes číselný to je jinej fofr ;-) |
||
Časová prodleva: 9 let
|
0