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

时间:2016-05-18 03:15:14

标签: mysql query-optimization

目标:需要查询来计算当前公司之外当前公司中不存在的所有“不同”线索。查询需要考虑多个表(lead_details,域,公司)之间的数百万条记录

<div class="case">
  <span>hey</span>
  <span>there</span>
</div>

结果:如果我在公司1上运行上述数据的查询,结果应该是(2)的数量,因为引导2&amp;引导3是唯一的,在公司1中不存在

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.

这是我的查询,如果有人有任何更好的建议,请告诉我。

domain_id domain_name company_id company_name lead_id lead_count
    "2"         "D2"        "2"       "C2"        "2"      "2"
    "3"         "D3"        "3"       "C3"        "3"      "1"

我有近百万行,所以需要找出更好的解决方案..

1 个答案:

答案 0 :(得分: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

汇总表。 (这可能对您的查询有用,也可能不实用,因为您正在查找 distinct 不存在。)每个月(或周或其他)计算最后一个小计月份并将其存储到另一个表中。然后对这个其他表的查询会快得多。