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是临时表的主键,但它不是表的主键用户。但我不知道这是否意义重大。
答
首先,您可以看到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替换*
请运行您的查询槽解释并发布结果。这两个msisdn列索引?如果是这样,请在两个表上运行OPTIMIZE TABLE。 – 2009-08-12 12:58:08