目标:需要查询以计算当前公司外部不存在但当前公司不存在的所有“不同”线索。查询需要考虑多个表(lead_details、domains、company)之间的数百万条记录
EXAMPLE:
company 1 -> domain 1 -> lead 1 lead_details records exists.
company 2 -> domain 2 -> lead 1 lead_details records exists.
company 2 -> domain 2 -> lead 2 lead_details records exists.
company 3 -> domain 3 -> lead 2 lead_details records exists.
company 3 -> domain 3 -> lead 3 lead_details records exists.
结果:如果我对公司 1 的上述数据运行查询,结果应该是计数 (2),因为潜在客户 2 和潜在客户 3 是唯一的并且在公司 1 中不存在
domain_id domain_name company_id company_name lead_id lead_count
"2" "D2" "2" "C2" "2" "2"
"3" "D3" "3" "C3" "3" "1"
这是我的查询,如果有人有更好的建议,请告诉我。
SELECT al.*
FROM (
SELECT
d.id AS domain_id,
d.name AS domain_name,
c.id AS company_id,
c.name AS company_name,
ld.lead_id,
count(ld.lead_id) as lead_count
FROM domains d
INNER JOIN company c
ON (c.id = d.company_id AND c.id != 1)
INNER JOIN lead_details ld
ON (ld.domain_id = d.id)
GROUP BY ld.lead_id
) al
LEFT JOIN (
SELECT ld.lead_id FROM domains d
INNER JOIN company c
ON (c.id = d.company_id AND c.id = 1)
INNER JOIN lead_details ld
ON (ld.domain_id = d.id)
) ccl
ON al.lead_id = ccl.lead_id
WHERE ccl.lead_id IS NULL;
我有近百万行,所以需要找出更好的解决方案..
最佳答案
A计划
图案
FROM ( SELECT ... )
JOIN ( SELECT ... ) ON ...
效率低下,尤其是在旧版本的 MySQL 中。这是因为两个子查询都没有任何索引,因此(在旧版本中)需要对其中一个子查询进行重复的全表扫描。
更好的方法是尝试重新表述为
FROM t1 ...
JOIN t2 ... ON ...
JOIN t3 ... ON ...
LEFT JOIN t4 ... ON ...
LEFT JOIN t5 ... ON ...
B计划
这更接近你所拥有的......
CREATE TEMPORARY TABLE ccl
( INDEX(lead_id) )
SELECT ... -- the stuff that is after LEFT JOIN
然后用 ccl
替换该子查询。这提供了原始查询中缺少的索引。
C 计划
汇总表。 (这对于您的查询可能实用也可能不实用,因为您正在寻找不同的并且不存在。)每个月(或每周或其他)计算最后一个的小计月并将其存储到另一个表中。那么针对这个其他表的查询会快得多。
关于mysql - 百万条记录MySQL查询优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37289639/