mysql - 百万条记录MySQL查询优化

标签 mysql query-optimization

目标:需要查询以计算当前公司外部不存在但当前公司不存在的所有“不同”线索。查询需要考虑多个表(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/

相关文章:

mysql - 顶级协作者 MySQL

MySQL-优化case语句

mysql - SQL优化: count all rows through subquery or own query/other improvements

MySQL:长时间运行的 LEFT JOIN 查询性能

mysql - 在 Visual Studio 2008 上使用 MySQL

mysql - 并发 mySql 数据库查询

php - 如何只插入相同日期的条目不超过4条?

MySql和subselect,为什么这么慢?

mysql - 我如何从 24-48 小时前获取 mysql 行?

mysql - Sql 组合列的第一个值和最后一个值来创建第三列的范围