使用sql和java程序提高性能

vyswwuz2  于 2021-06-15  发布在  Mysql
关注(0)|答案(3)|浏览(331)

我有一个代码,我从不同的来源获得数据,并对它们进行排序和排序,以发送给用户。
我通过触发一个查询获取数据,该查询包含对dto列表的多个连接,然后再次触发另一个查询,该查询进一步包含对同一dto列表的多个连接。然后,我将添加两个dto列表以呈现给用户。
查询1:从表1、表2中选择*。。。。
查询2:从表5、表7中选择*。。。。

dto1.addAll(dto2);

dto1.sort(Comparator....);

我再次按程序排序是因为以下原因:

Query 1 returned sorted data lets assume
1,2,3,4
Query 2 returned sorted data lets assume
1,2,3,4

After combining both the lists, I will get
1,2,3,4,1,2,3,4
Expected data
1,1,2,2,3,3,4,4

我的问题是,哪种情况下的表现会更好?
从两个查询中提取排序后的数据,添加列表,然后对它们进行排序和排序。
从两个查询中提取未排序的数据,添加列表,然后仅排序和排序一次。
在第一种情况下,它将被排序三次,但在第二种情况下,它将只排序和排序一次。
当我把数十万条记录放到表中进行测试时,我没有发现太大的差异,第二种情况比第一种情况快一点。
那么,在效率和性能方面,应该推荐哪一种呢?

kxkpmulp

kxkpmulp1#

我认为第二个更好,因为如果在合并两个列表后运行排序算法。所以不需要对数据库运行排序查询。所以数据库排序查询不需要第二次查询。
但是,如果您以排序顺序检索数据,然后再次运行排序算法,则执行该算法将需要更多的成本,尽管其成本可以忽略不计。

uttx8gqw

uttx8gqw2#

在mysql中完成这一切:

( SELECT ... )
UNION ALL
( SELECT ... )
ORDER BY ...

不要担心在两个选择中排序;等到最后再做。 ALL 假设没有需要清除的DUP。
这种方法可能是最快的,因为它是对数据库的单个sql请求。因为它只做一种。

bbmckpt7

bbmckpt73#

我想这三个都会有相似的表现。你可以用其中一个来提高速度,但我不认为这有什么意义。
现在,就负载而言,情况就不同了。您是否更受cpu资源(在本地计算机中)或数据库资源(在远程db服务器中)的限制?大多数情况下,当应用程序处理大量其他内容时,数据库将处于空闲状态。如果是这样的话,我宁愿把负载放在数据库上,而不是应用程序本身:也就是说,我会让数据库在一个sql调用中组合和排序数据;然后应用程序将简单地使用现成的数据。
12月22日编辑。2018:
如果两个查询都在同一个数据库上运行,则可以将它们作为单个查询运行,并使用cte(公共表表达式)组合结果。例如:

with
x (col1, col2, col3, col4, ...) as (
  select * from TABLE1, TABLE2... -- query 1
  union all
  select * from TABLE5, TABLE7... -- query 2
)
select * from x
order by col1

这个 ORDER BY 最后对组合结果进行运算。或者,如果您的数据库不支持CTE,则可以编写:

select * from (
  select * from TABLE1, TABLE2... -- query 1
  union all
  select * from TABLE5, TABLE7... -- query 2
) x
order by col1

相关问题