Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Powolne zapytanie z klauzulą ​​HAVING - czy mogę to przyspieszyć?

Szybkim rozwiązaniem byłoby filtrowanie w podzapytaniu:

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

Ponieważ w przeciwnym razie takie grupujące zapytanie wykonujesz dla każdego możliwego kandydata. Możemy uczynić to bardziej eleganckim dzięki 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 jeszcze nie skończyliśmy, teraz użyjemy EXISTS dla każdego element. To dziwne, ponieważ zapytanie zależy tylko od s.id , więc zależy to tylko od grupy , a nie poszczególne wiersze. A więc potencjał przyspieszenie, ale to zależy od rozmiarów tabel itp. jest przeniesienie warunku do HAVING oświadczenie:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zdarzenia po stronie serwera z PHP i MySQL

  2. Wykonywanie złączeń między wieloma heterogenicznymi bazami danych, np. PostgreSQL i MySQL

  3. Mysql Split String i Select z wynikami

  4. Normalizacja bazy danych dla systemu przesyłania wiadomości podobnego do Facebooka

  5. ustawić sesję w obiekcie sesji SQLAlchemy