Trong Truy vấn 3, về cơ bản, bạn đang thực hiện một truy vấn con cho mỗi hàng mybigtable đối với chính nó.
Để tránh điều này, bạn cần thực hiện hai thay đổi lớn:
THAY ĐỔI CHỦ YẾU # 1: Tái cấu trúc truy vấn
Đây là truy vấn ban đầu của bạn
Select count(*) as total from mybigtable
where account_id=123 and email IN
(select distinct email from mybigtable where account_id=345)
Bạn có thể thử
select count(*) EmailCount from
(
select tbl123.email from
(select email from mybigtable where account_id=123) tbl123
INNER JOIN
(select distinct email from mybigtable where account_id=345) tbl345
using (email)
) A;
hoặc có thể là số lượng trên mỗi email
select email,count(*) EmailCount from
(
select tbl123.email from
(select email from mybigtable where account_id=123) tbl123
INNER JOIN
(select distinct email from mybigtable where account_id=345) tbl345
using (email)
) A group by email;
THAY ĐỔI CHỦ YẾU # 2: Lập chỉ mục đúng
Tôi nghĩ rằng bạn đã có điều này vì Truy vấn 1 và Truy vấn 2 chạy nhanh. Hãy chắc chắn rằng bạn có một chỉ mục tổng hợp trên (account_id, email). Làm SHOW CREATE TABLE mybigtable\G
và chắc chắn rằng bạn có một cái. Nếu bạn không có nó hoặc nếu bạn không chắc chắn, thì hãy tạo chỉ mục bằng mọi cách:
ALTER TABLE mybigtable ADD INDEX account_id_email_ndx (account_id,email);
CẬP NHẬT 2012/03/07 13:26 EST
Nếu bạn muốn thực hiện KHÔNG IN (), hãy thay đổi INNER JOIN
thành a LEFT JOIN
và kiểm tra phía bên phải là NULL, như thế này:
select count(*) EmailCount from
(
select tbl123.email from
(select email from mybigtable where account_id=123) tbl123
LEFT JOIN
(select distinct email from mybigtable where account_id=345) tbl345
using (email)
WHERE tbl345.email IS NULL
) A;
CẬP NHẬT 2012/03/07 14:13 EST
Vui lòng đọc hai liên kết này khi thực hiện THAM GIA
Đây là một Video YouTube tuyệt vời nơi tôi học cách tái cấu trúc các truy vấn và cuốn sách được dựa trên