如何优化多表连接视图以获得更快的响应?

Posted

技术标签:

【中文标题】如何优化多表连接视图以获得更快的响应?【英文标题】:How to optimise multi table join view for a faster response? 【发布时间】:2016-02-02 10:36:24 【问题描述】:

问题陈述

我有一个页面,它必须显示来自 多连接查询 的记录(视图由不同表和子视图上的多个连接组成)。随着时间的推移,正在连接的六个表中有两个大小增长非常迅速,在此过程中查询变得越来越慢

无权重新设计架构,我应该使用现有的表格并显示可用数据的摘要。用户可以选择在多个列值和范围内过滤主数据,因此对于每个过滤器/取消过滤器操作,我都会点击存储库。

我尝试了什么?

我已经尽可能优化了带有索引的表。 我已为 mysql 服务器移动到内存和 CPU 功率更高的计算机

正在使用的技术 即将实现,它的 MySQL DB,上面有 SpringJPA+Hibernate。其中两个表有超过百万条记录,目前存储库查询需要 20 秒的时间,这是不可接受的。

关于如何优化的任何提示,例如在内存缓存/数据库中使用或尝试?我感谢任何正确方向的指示!

【问题讨论】:

连接看起来如何? 所以我们需要神奇地知道结构、查询等。没问题。只需执行以下阅读minimal reproducible example,您就会找到解决方案。 “数据摘要”是什么意思? 【参考方案1】:

拉姆,

由于我们无法访问您当前的查询,或者至少是您应该尝试的预期输出:

    尽可能多地缓存数据。您可以使用以下策略:

    1.1。创建一个中间表来存储全局数据,以便快速搜索 1.2 缓存使用的查询数据并将其与条件哈希相关联。看看Redis,速度挺快的,每次都能存储很多信息;

    如果您在搜索中不需要它们,请不要进行所有连接; 如果可能,请尝试在您的查询中实现延迟加载 (https://en.wikipedia.org/wiki/Lazy_loading)。 拆分输出。例如,如果您有月份数据,请缓存每个关闭月份的数据,以便您可以将查询重点放在最近的数据上 以小步骤拆分您的输出。如果您可以将查询分解为更小的子集并单独显示每个子集,请使用 Ajax,以便用户可以看到他的数据已经出现。

由于我们显示的统计信息量很大,我有一个开始屏幕需要 2 分钟才能显示。因此我们将其拆分为更小的页面(使用 4 和 5)并大量使用缓存(1.2)。现在它在 1 秒内加载(渲染图表需要时间)。

祝你好运

【讨论】:

以上是关于如何优化多表连接视图以获得更快的响应?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL调优--05---多表查询优化子查询优化 ORDER BY优化GROUP BY优化分页查询优化

oracle 中多表连接如何用

「mysql优化专题」你们要的多表查询优化来啦!请查收

从多表连接后的select count(*)看待SQL优化

oracle(sql)基础篇系列——多表连接查询子查询视图

mysql多表查询并创建视图