MySQL查询使用Java的时间太长

我有三个mysql表:

  1. 顾客

  2. 抱怨

  3. 恢复

问题陈述:我有5万多个客户,我想搜索有恢复请求的客户。

该问题已得到很好的解决,并且可以正常工作,但是问题是查询最多需要30分钟或更长的时间。

请指导我如何减少查询所花费的时间,或者如何加快搜索的速度?

这是mysql表的快速帮助ERD:

http://img2.mukewang.com/607f8cb20001b84205970306.jpg

我再次明确指出,问题已解决且可以正常工作,但是由于数据库中存在大量客户和投诉,因此查询最多需要30分钟才能完成。

有什么技术可以减少查询时间或加快搜索速度?

JAVA CODE 我有两种方法:

  1. getMultiSelectionCustomersProfiles(....)

  2. searchRecoveryRequest(字符串customerRegistrationCode)

注意:method2在method1中被调用


繁华开满天机
浏览 203回答 1
1回答

杨魅力

如果没有运行的测试系统,就很难找到合适的解决方案。我发现可疑的是,您的第一个查询的每个结果行都会调用您的2nd方法,并且它似乎每次都打开和关闭数据库连接。(您ConnectionHandler可能实现了正确的连接池,但是我无法在不知道代码的情况下进行判断。如果每次都真正打开和关闭连接,那么这是迄今为止代码中最昂贵的事情)。但是,即使有适当的连接池,您的第二个方法也会为每个调用创建并执行新的SQL语句。这称为N + 1选择查询问题。因此,我建议进行以下改进:尝试将两个SQL语句合并为一个(可能使用嵌套的SELECT等)。这样就不能执行1 + N查询,这将大大减少执行时间。如果那不可能,请PreparedStatement对第二种方法至少使用a 。确保在进入循环之前仅创建一次准备好的语句。因此,您必须使用第一种方法创建和准备它。因此,您需要第二个数据库连接。也分别在循环之后之前打开和关闭它。另一策略:运行第一个查询,迭代结果集,然后将所有结果放入regCodes列表中。关闭查询后,请使用批处理via处理PreparedStatement所有regCodes。另一个优点:因此,仅需要一个数据库连接。顺便说一句:成熟的对象关系映射框架(例如Hibernate)已经提供了开箱即用的这些策略,以避免或至少减轻了1 + N选择问题。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java