MySQL JOIN保持时间安排

时间:2017-02-25 17:56:36

标签: mysql join

我目前正在尝试在本地MySQL数据库中的两个表之间运行JOIN,但它无法正常工作。下面是查询,我甚至将查询限制为10行只是为了运行测试。在运行此查询15-20分钟后,它告诉我“错误代码”2013.在查询期间丢失了与MySQL服务器的连接“。我的计算机不会睡觉,我没有做任何事情来中断连接。

SELECT rd_allid.CreateDate, rd_allid.SrceId, adobe.Date, adobe.Id
FROM rd_allid JOIN adobe
ON rd_allid.SrceId = adobe.Id
LIMIT 10

rd_allid表有1700万行数据,adobe表有1000万行。我知道这很多,但我有一台强大的电脑。我的处理器是i7 6700 3.4GHz,我有32GB的内存。我也在固态驱动器上运行它。

为什么我无法运行此查询?

2 个答案:

答案 0 :(得分:0)

您可以尝试以下内容:

SELECT rd_allidT.CreateDate, rd_allidT.SrceId, adobe.Date, adobe.Id 
FROM 
(SELECT CreateDate, SrceId FROM rd_allid ORDER BY SrceId LIMIT 1000) rd_allidT     
INNER JOIN 
(SELECT Id FROM adobe ORDER BY Id LIMIT 1000) adobeT ON adobeT.id = rd_allidT.SrceId;

这可以帮助您缩短响应时间。

此外,如果您对所有关系不感兴趣,还可以在INNER JOIN之前放置一些WHERE子句,使查询更快。

答案 1 :(得分:0)

“为什么我无法运行此查询?”

没有足够的信息来确定究竟发生了什么。我们只能猜测和推测。并提出一些建议。

我怀疑MySQL在应用LIMIT 10子句之前试图实现整个结果集。对于此查询,LIMIT子句没有优化。

我们可能猜测JOIN操作没有合适的索引,这导致MySQL执行嵌套循环连接。

我们还怀疑MySQL遇到了一些导致会话终止的资源限制。可能填满/ tmp中的所有空间(这通常会引发错误,例如“无效/损坏的myisam表'#tmpNNN'”,类似的东西。或者它可能是其他一些资源限制。没有进行分析,我们'只是猜测。

MySQL可能会在错误日志(hostname.err)中写入内容。我在那里检查。

但无论MySQL遇到什么情况(“我为什么无法运行此查询”这一问题的答案)

我正在认真质疑查询的目的。为什么要运行该查询?为什么返回特定结果集很重要?

我们可以执行几种可能的查询。其中一些会运行很长时间,而另一些会更高效。

调查查询性能的最佳方法之一是使用MySQL EXPLAIN。这将向我们展示查询执行计划,揭示MySQL将执行的操作,以及将以何种顺序和索引使用。

我们可以根据显示的查询,对一些可能添加的索引提出一些建议。 on adobe (id, date)

我们可以就查询的修改提出一些建议(例如,添加WHERE子句,使用LEFT JOIN,合并内联视图等等。但是我们没有足够的规范来推荐合适的替代方案。