Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Truy vấn chậm với mệnh đề HAVING - tôi có thể tăng tốc không?

Cách khắc phục nhanh chóng là bộ lọc trong truy vấn con:

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

Vì nếu không, bạn thực hiện truy vấn nhóm như vậy cho mọi ứng viên có thể. Chúng tôi có thể làm cho điều này thanh lịch hơn với 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

Nhưng chúng ta vẫn chưa hoàn thành, bây giờ chúng ta sẽ sử dụng EXISTS cho mọi yếu tố. Điều đó thật kỳ lạ vì truy vấn chỉ phụ thuộc vào s.id , vì vậy nó chỉ phụ thuộc vào nhóm , không phải các hàng riêng lẻ. Vì vậy, một tiềm năng tăng tốc, nhưng điều này phụ thuộc vào kích thước của các bảng, v.v. là chuyển điều kiện sang HAVING tuyên bố:

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. Cách tùy chỉnh bản sao lưu MySQL &MariaDB của bạn với ClusterControl

  2. Thứ tự tìm kiếm toàn văn bản MYSQL theo mức độ liên quan

  3. Xuất cơ sở dữ liệu thông qua mã java của tôi

  4. Thứ tự MySQL theo mức độ liên quan

  5. hiển thị liên kết trong php