我正在加入两张大桌子
表中的行数为:
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 行)
答案 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 ...
。
你确定你真的想加入没有任何标准的完整表吗?通常这不是必需的,因为人们会对特定数据感兴趣。