Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL查询优化有数百万条记录_Mysql_Query Optimization - Fatal编程技术网

MySQL查询优化有数百万条记录

MySQL查询优化有数百万条记录,mysql,query-optimization,Mysql,Query Optimization,目标:需要查询以统计当前公司之外当前公司中不存在的所有“不同”潜在客户。查询需要在多个表(lead_详细信息、域、公司)之间记录数百万条记录 结果:如果我在公司1上运行上述数据的查询,结果应该是(2)计数,因为潜在客户2和潜在客户3是唯一的,并且在公司1中不存在 domain_id domain_name company_id company_name lead_id lead_count "2" "D2" "2" "C2" "2"

目标:需要查询以统计当前公司之外当前公司中不存在的所有“不同”潜在客户。查询需要在多个表(lead_详细信息、域、公司)之间记录数百万条记录

结果:如果我在公司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


总表。(这对于您的查询可能是可行的,也可能是不可行的,因为您看起来不同,并且不存在。)每月(或每周或其他任何时间)计算上个月的小计,并将其存储到另一个表中。然后,对另一个表的查询速度会快得多。

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


总表。(这对于您的查询可能是可行的,也可能是不可行的,因为您看起来不同,并且不存在。)每月(或每周或其他任何时间)计算上个月的小计,并将其存储到另一个表中。然后,对另一个表的查询速度会快得多。

请将
SHOW CREATE table domains
的输出添加到您的问题中,对于
公司
潜在客户详细信息
表也是如此。这将允许我们查看现有索引,并验证数据类型。请将
SHOW CREATE TABLE domains
的输出添加到您的问题中,对于
company
lead\u details
表也是如此。这将允许我们查看现有索引,以及验证数据类型。