sql >> Databáze >  >> RDS >> Mysql

Pomalý dotaz s klauzulí HAVING - mohu to urychlit?

Rychlá oprava by byla filtrovat v poddotazu:

SELECT count(d.id) AS dcount, s.id, s.name
FROM sites s
LEFT JOIN deals d ON (s.id = d.site_id AND d.is_active = 1)
WHERE (s.is_active = 1)
AND s.id IN(
    SELECT g.site_id
    FROM gstats g
    WHERE g.start_date > '2015-04-30' AND g.site_id = s.id
    GROUP BY g.site_id
    HAVING SUM(g.results) > 100
)
GROUP BY s.id
ORDER BY dcount ASC

Protože jinak uděláte takový seskupovací dotaz pro každého možného kandidáta. Můžeme to udělat elegantnějším pomocí EXISTS :

SELECT count(d.id) AS dcount, s.id, s.name
FROM sites s
LEFT JOIN deals d ON (s.id = d.site_id AND d.is_active = 1)
WHERE (s.is_active = 1)
AND EXISTS (
    SELECT 1
    FROM gstats g
    WHERE g.site_id = s.id AND g.start_date > '2015-04-30'
    HAVING SUM(g.results) > 100
)
GROUP BY s.id
ORDER BY dcount ASC

Ale ještě jsme neskončili, nyní použijeme EXISTS pro každý živel. To je divné, protože dotaz závisí pouze na s.id , takže záleží pouze na skupině , nikoli jednotlivé řádky. Takže potenciál zrychlení, ale to závisí na velikostech tabulek atd. je přesunout podmínku do HAVING prohlášení:

SELECT count(d.id) AS dcount, s.id, s.name
FROM sites s
LEFT JOIN deals d ON (s.id = d.site_id AND d.is_active = 1)
WHERE (s.is_active = 1)
GROUP BY s.id
ORDER BY dcount ASC
HAVING EXISTS (
    SELECT 1
    FROM gstats g
    WHERE g.site_id = s.id AND g.start_date > '2015-04-30'
    HAVING SUM(g.results) > 100
)


  1. Pořadí MySQL podle dvou sloupců

  2. mysql časové hodiny

  3. VYBRAT uživatele z databáze MySQL pomocí bitové masky oprávnění?

  4. Kulaté datum MySQL na začátek týdne a měsíce