加入两个大表(SQL)

时间:2016-10-20 16:54:30

标签: sql

我正在加入两张大桌子

表中的行数为:

  

root @ server1:〜#/ a / bin / sql2"选择paramName,来自RA_ResourceThresholds&#34的值; | wc -l   69304

     

root @ server1:〜#/ a / bin / sql2"选择regionID,来自的resourceID   RA_RegionInfo" | wc -l 28867

但是,当我尝试加入它们时,我从查询中得到关于中间数据集太大的错误。有人能告诉我一个解决方法吗?

  

root @ server1:〜#/ a / bin / sql2" SELECT ri.regionID,ri.resourceID,   rt.paramName,rt.value FROM RA_RegionInfo ri,RA_ResourceThresholds rt   WHERE ri.resourceID = rt.resourceID AND ri.regionOffset = rt.regionOffset"   错误:超出资源限制:中间表大小(限制3000000   行)

1 个答案:

答案 0 :(得分:2)

你说很多人共享同一个recourceID,但不是regionID。因此加入两者的组合不应该导致那么多记录。

也许MySQL只在recourceID上使用索引来构建一个想要扫描regionID匹配的中间结果。因此记录太多了。

因此,请确保您在两个表中的两个字段都有索引:

create index idx_ri_both on RA_RegionInfo(regionID, recourceID);
create index idx_rt_both on RA_ResourceThresholds(regionID, recourceID);

这应该导致直接加入匹配记录,而不是在第一步中加入超过需要的记录。

我将regionID作为索引中的第一列,因为我认为这是更具选择性的一列。

顺便说一下:1992年以逗号分隔的连接语法变得多余。它不应再被使用了。从字面上解释这将是一个交叉连接,即20亿行,之后将由where子句过滤。 (但是,MySQL的优化器应该看到这一点并直接应用连接条件。)使用显式连接代替:FROM RA_RegionInfo ri JOIN RA_ResourceThresholds rt ON ...

你确定你真的想加入没有任何标准的完整表吗?通常这不是必需的,因为人们会对特定数据感兴趣。