Autor Zpráva
Petr-K
Profil *
Zdravím,
potřeboval bych pomoci zjednodušit jeden MySQL dotaz.
Mám následující tabulku dat (jen vzorová data):
 ----------------------------------------------------- 
 |id_orderd |id_object   |date_start     |date_end   |
 -----------------------------------------------------
 |1         |13         |2012-01-05      |2012-01-13 |
 |2         |113        |2012-01-03      |2012-01-21 |
 |3         |3          |2012-01-02      |2012-01-26 |
 |4         |3          |2012-01-06      |2012-01-20 |
 |5         |13         |2012-01-01      |2012-01-31 |
 |6         |223        |2012-01-14      |2012-03-31 |
 |7         |13         |2012-01-01      |2012-01-31 |
 |8         |13         |2012-01-31      |2012-03-01 |
 |9         |113        |2012-01-14      |2012-01-20 |
 |10        |13         |2012-01-15      |2012-01-17 |
 |11        |22         |2012-01-21      |2012-01-31 |
 |12        |13         |2012-01-15      |2012-01-31 |
 -----------------------------------------------------

Z této tabulky dat chci vybrat poslední vloženou objednávku (id_orderd) pro každý objekt (id_object):
Můj dotaz:
SELECT co.*
FROM `credit_order` AS co
INNER JOIN(
  SELECT DISTINCT `id_object`, MAX(`id_order`) AS `id_order`
  FROM `credit_order`
  GROUP BY `id_object`) AS ij on co.`id_object` = ij.`id_object` and co.`id_order` = ij.`id_order`
ORDER BY `id_order` DESC;

Dotaz funguje, výsledek je:
 ----------------------------------------------------- 
 |id_orderd |id_object   |date_start     |date_end   |
 -----------------------------------------------------
 |12        |13         |2012-01-15      |2012-01-31 |
 |11        |22         |2012-01-21      |2012-01-31 |
 |9         |113        |2012-01-14      |2012-01-20 |
 |4         |3          |2012-01-06      |2012-01-20 |
 -----------------------------------------------------

Problém je v tom, že jsem výsledek tohoto dotazu (výslednou tabulku) chtěl pomocí LEFT JOIN připojit k jiné tabulce. A obávám se, že už by to mohlo dělat problém, aby to nebylo při větším objemu dat moc náročné. Takže mé dotazy:
1) Je lepší si vytvořit jeden takto komplikovanější dotaz a nebo použít raději 4 jednoduché SELECTy (pro každý objekt jeden)
2) Jaké situace by musely nastat, aby začal takto napsaný dotaz (i s tím plánovaným LEFT JOIN) přetěžovat DB (např. počet jeho volání, velikost tabulky)
3) Jakým způsobem lze zjednodušit dotaz, případně čeho se vyvarovat

Děkuji,
Petr
Kajman
Profil
Databáze jsou stavěné, aby joiny uměly. Asi se přehnaně bojíte, vyzkoušejte si to. Pokud tam jsou rozumné indexy, snad nebudete z výkonu zklamán.
Petr-K
Profil *
Děkuji za rychlou odpověď.
Jestli tomu dobře rozumím, jestliže jste nenavrhl jiné lepší řešení, pak v tomto případě budu muset použít vnořený SELECT.
Ale přeci mi to nedá a zopakuji jeden ze svých dotazů, který mě zajímá, jestě jednou: Jaké množství dat musí být v tabulce, nebo jaká návštěvnost musí být na webu (nebo jiné aspekty) aby bylo možné zaznamenávat nějaké zpomalení DB (myslím to teď všeobecně).
Kajman
Profil
Současný dotaz mi přijde nad onou datavou strukturou optimální (nejlépe existuje-li vícesloupcový index (id_object,id_orderd)). Stačí k němu přidat join, rozdíl v rychlosti tam nebude asi velký - nejvíce výkonu asi stále bude potřeba na výpočet maximálního id_orderd pro každý id_object.

Všeobecně na takovou otázku odpovědět nelze. Musíte si to změřit pro konkrétní tabulku, konkrétní dotaz nad konkrétními daty.

Ve chvíli, kdy bude dotaz příliš pomalý, bude čas popřemýšlet, zda si to maximum průběžně nepočítat v pomocné tabulce.

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: