2016-05-18 113 views
1

目标:需要查询计算所有“不同”导致没有当前公司目前存在的公司以外。查询需要考虑到数以百万计的多个表之间的记录(lead_details,域公司)优化有上百万的记录

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; 

我几乎百万行,因此需要找出更好的解决方案..

+0

请新增SHOW的'输出CREATE TABLE domains'你的问题,与同为'company'和'lead_details'表。这将允许我们查看现有索引以及验证数据类型。 –

回答

0

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计划

汇总表。 (这可能是也可能不是您所查询的实际,因为你正在寻找不同不存在)每个月(或每周或其他)计算小计上个月,并将其存储到另一个表。然后对这个其他表格的查询将快得多。

相关问题