基于 mysql 视图结果创建表以加快获取速度

Posted

技术标签:

【中文标题】基于 mysql 视图结果创建表以加快获取速度【英文标题】:Creating a table based on a mysql view result for faster fetch 【发布时间】:2021-11-30 03:23:32 【问题描述】:

所以我们的网站有不断增长的数据,我们通常使用 mysql 视图来查看记录列表,以便我们可以简化代码中的选择查询。从那以后一直是这种做法,但是随着时间的推移,这些需求给 SQL 视图带来了很多复杂性,例如 sum、count of 等。所以我们的大多数视图都相对较慢。

为了保留在 MySQL 视图中创建的逻辑(因为这是我们的客户偏好),我们确实尝试了以下方法:

选项 1 是:

    启动 RDS 2 从我们的 RDS 1 的视图中选择 * 插入到 RDS 2 中的所有结果中 连接 Lists API 以从 RDS 2 获取数据

#4 它返回很快,因为数据库不会重新计算总和,不再计数,我们只需要获取结果。 #2 & #3:

我们的 API 服务器正在运行 nodejs,它连接到这 2 个数据库。 每个列表/表格我只保存 1000 个。因此,如果我有 6 个视图 = 正在创建 6 个平面表。 至少每分钟发生一次。在重复整个过程之前,我们实施了一个标志来检查是否有正在进行的过程。

此选项的问题:它使我们的 RDS 1 和 API 服务器紧张。

选项 2 是:

    在同一个 RDS 1 上创建另一个表 插入到从 sql 视图中选择 连接列表 API 以从创建的平面表中获取数据

此选项的问题:尚未在我们的测试环境中对其进行测试,但在我的本地进行 #2 时,无法更新某些表行,并且出现死锁错误。

不确定我是否走在正确的轨道上,或者除了重新编码或修复我们的数据库结构或完全不使用 MySQL 视图之外,这是否还有解决方案。

提前谢谢你。

【问题讨论】:

您似乎需要某种缓存,而不是第二个数据库或表。 是的,就像 redis。然后我只需要启动另一个副本阅读器,这样我就可以将所有选择查询重定向到那个而不影响其他事务... 【参考方案1】:

“sum, count of, etc”——这有点像针对数据仓库中大型“Fact”表的“报告”。

计划 A -- 汇总表

如果数据是静态的(插入后),则构建和维护汇总表。这将更快,更高效。您仍然可以将VIEWStored Proc 放在必要的`SELECTs 前面。

此类摘要表将存在于同一实例上,并且可能仅占用 20% 的额外磁盘空间。而且,由于它们的运行速度非常快,因此无需设置另一台服务器。 http://mysql.rjweb.org/doc.php/summarytables

VIEWs 是语法糖。它们永远不会(?)比底层的SELECT 快,有时甚至更慢。正如您的客户所说,它们确实使查询更容易。

B 计划——复制

处理过多查询(与处理慢查询相反)的另一种方法是使用“复制”。写入到主节点并被复制到副本节点。您的VIEWs 可以访问副本,因为它们(我假设)是只读的。可以添加任意数量的副本,从而实现“无限”缩放。

(A和B都可以。)

【讨论】:

A 计划 - 是的,已经提出,但这意味着,我们将更新影响汇总表的大多数页面中的汇总表。计划 B - 我们的 RDS 处于极光中,目前有写入器和读取器副本。客户愿意花钱升级,但不具备未来感,因为它不划算。 @JanLmpn - 详细说明您如何设想汇总表。我已经实现了好几次——开销很小。

以上是关于基于 mysql 视图结果创建表以加快获取速度的主要内容,如果未能解决你的问题,请参考以下文章

mysql的查询表与查询视图的问题

如何生成波形表以加快实时音频合成

如何获取视图之间的mysql依赖关系?

我应该在哈希图中保存一个数据库表以加快我的程序吗

MySQL 连接速度慢。任何加快速度的方法

mysql视图的作用是啥