如何优化多表连接视图以获得更快的响应?
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 秒内加载(渲染图表需要时间)。
祝你好运
【讨论】:
以上是关于如何优化多表连接视图以获得更快的响应?的主要内容,如果未能解决你的问题,请参考以下文章