mysql分区一个非常大的内部连接sql查询

cqoc49vn  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(315)

sql查询是相当标准的内部连接类型。例如,比较n个表以查看所有n个表中存在哪些customerid将是一个基本步骤,其中。。。并键入query。
问题是表的大小大于1000万条记录。数据库已反规范化。规范化不是一个选项。查询要么需要很长时间才能完成,要么从未完成。
我不确定它是否相关,但我们正在使用springxd作业模块进行其他类型的查询。
我不知道如何对这类作业进行分区,以便它可以并行运行,从而减少所需时间,并且如果某个步骤/子部分失败,它可以从停止的地方继续。
其他有类似问题的帖子建议使用数据库引擎之外的替代方法,比如在代码中实现循环连接,或者使用mapreduce或hadoop,但从未使用过这两种方法,我不确定它们是否值得研究这个用例。
这种操作的标准方法是什么,我想这是相当普遍的。我可能使用了错误的搜索词来研究方法,因为我没有遇到任何股票标准解决方案或明确的方向。
一个相当隐晦的原始要求是:
比较三个非常大的表中的party\u id列,以确定三个表中可用的客户,即三个表之间的客户和操作。sample1.party\u id和sample2.party\u id和sample3.party\u id
如果操作是或,则选择三个表中的所有可用客户。sample1.party\u id或sample2.party\u id或sample3.party\u id
和/或在表之间使用,然后根据需要进行比较。sample1.party\u id和sample2.party\u id或sample3.party\u id
我用这个定义建立了4个测试表

CREATE TABLE `TABLE1` (
  `CREATED` datetime DEFAULT NULL,
  `PARTY_ID` varchar(45) NOT NULL,
  `GROUP_ID` varchar(45) NOT NULL,
  `SEQUENCE_ID` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`SEQUENCE_ID`)
) ENGINE=InnoDB AUTO_INCREMENT=978536 DEFAULT CHARSET=latin1;

然后向每个记录添加1000000条记录,这些记录只是一个随机数,其范围应导致连接。
我使用了以下测试查询

SELECT `TABLE1`.`PARTY_ID` AS `pi1`, `TABLE2`.`PARTY_ID` AS `pi2`, `TABLE3`.`PARTY_ID` AS `pi3`, `TABLE4`.`PARTY_ID` AS `pi4` FROM `devt1`.`TABLE2` AS `TABLE2`, `devt1`.`TABLE1` AS `TABLE1`, `devt1`.`TABLE3` AS `TABLE3`, `devt1`.`TABLE4` AS `TABLE4` WHERE `TABLE2`.`PARTY_ID` = `TABLE1`.`PARTY_ID` AND `TABLE3`.`PARTY_ID` = `TABLE2`.`PARTY_ID` AND `TABLE4`.`PARTY_ID` = `TABLE3`.`PARTY_ID`

它应该在10分钟内完成,对于10倍大的table。我的测试查询还没有完成,已经运行了15分钟

kyxcudwk

kyxcudwk1#

以下操作可能比现有的基于联接的查询执行得更好:

select party_id from
(select distinct party_id from SAMPLE1 union all
 select distinct party_id from SAMPLE2 union all
 select distinct party_id from SAMPLE3) as ilv
group by party_id 
having count(*) = 3

修改 count(*) 条件以匹配要查询的表数。
如果你想回来 party_id 任何表中的值,而不是所有表中的值,则忽略最后的值 having 条款。

相关问题