MySQL JOIN查询花费很长时间才能完成

问题描述:

我有一张表,其中大约有250,000条记录,用户名为users。我还有另一张桌子,上面有大约75,000条记录。登台只有一列msisdn。我想查看在用户中有多少行在分段不存在MySQL JOIN查询花费很长时间才能完成

我有以下查询,这是我在一个小的数据子集进行测试,它似乎很好地工作:

SELECT 
    s.* 
    FROM staging s 
     LEFT OUTER JOIN users u ON u.msisdn=s.msisdn 
     WHERE u.msisdn IS NULL 

然而,问题是,当我尝试运行的完整列表在此查询的25万用户。它在我停下之前跑了一个小时。有什么办法可以优化这个查询吗?

我已经开始运行在升级的数据子集的查询,但这次是可怕的手册:

SELECT 
    s.* 
    FROM staging s 
     LEFT OUTER JOIN users u ON u.msisdn=s.msisdn 
     WHERE u.msisdn IS NULL 
    LIMIT 0,10000 

MSISDN是临时表的主键,但它不是表的主键用户。但我不知道这是否意义重大。

+0

请运行您的查询槽解释并发布结果。这两个msisdn列索引?如果是这样,请在两个表上运行OPTIMIZE TABLE。 – 2009-08-12 12:58:08

首先,您可以看到MySQL使用EXPLAIN命令的索引。只需在查询前面输入EXPLAIN,结果将显示它正在使用的索引(如果有)。据推测,如果数据集相对较小(如250,000条记录)的速度很慢,那么它不会利用非常有效的索引,并且您将能够看到在哪里。

这也可能有助于改写查询作为NOT EXISTS像这样:

SELECT s.* FROM staging s 
WHERE NOT EXISTS (SELECT 1 FROM users WHERE users.misdn = s.misdn) 

将索引放在每个表的msisdn列中。由于它不是users上的PK,所以您需要在其上放置非聚集索引。这应该会加快你的查询速度。

我不知道这会多快,但你可以尝试类似的东西。

select msisdn 
from staging 
where msisdn not in (select msisdn from users) 

另外,请确保两个表中的msisdn列的索引都存在。这应该会加快速度。

事情可以做,以加快此查询:

  • 确保MSISDN两个表
  • 在被索引
  • 优化您的表格
  • 用msisdn替换*