sql >> Database >  >> RDS >> Mysql

Langzame zoekopdracht met HAVING-clausule - kan ik het versnellen?

Een snelle oplossing zou zijn om te filteren in de subquery:

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

Anders doe je zo'n groeperingsquery voor elke mogelijke kandidaat. We kunnen dit eleganter maken met 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

Maar we zijn nog niet klaar, nu gaan we de EXISTS . gebruiken voor elke element. Dat is raar, aangezien de zoekopdracht alleen afhangt van s.id , dus het hangt alleen af ​​van de groep , niet de afzonderlijke rijen. Dus een potentieel speedup, maar dit hangt af van de grootte van de tabellen, enz. is om de voorwaarde te verplaatsen naar een HAVING verklaring:

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. Nieuwe installatie van python 3.7 / django 2.2.1 herkent niet dat mysqlclient is geïnstalleerd

  2. AspNet.Identity-kern gebruiken in Mijn SQL-database

  3. Een tabel draaien in SQL (d.w.z. kruistabel / kruistabel)

  4. Verduidelijking van de samenvoegvolgorde voor het maken van tijdelijke tabellen