基于 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 -- 汇总表
如果数据是静态的(插入后),则构建和维护汇总表。这将更快,更高效。您仍然可以将VIEW
或Stored Proc
放在必要的`SELECTs 前面。
此类摘要表将存在于同一实例上,并且可能仅占用 20% 的额外磁盘空间。而且,由于它们的运行速度非常快,因此无需设置另一台服务器。 http://mysql.rjweb.org/doc.php/summarytables
VIEWs
是语法糖。它们永远不会(?)比底层的SELECT
快,有时甚至更慢。正如您的客户所说,它们确实使查询更容易。
B 计划——复制
处理过多查询(与处理慢查询相反)的另一种方法是使用“复制”。写入到主节点并被复制到副本节点。您的VIEWs
可以访问副本,因为它们(我假设)是只读的。可以添加任意数量的副本,从而实现“无限”缩放。
(A和B都可以。)
【讨论】:
A 计划 - 是的,已经提出,但这意味着,我们将更新影响汇总表的大多数页面中的汇总表。计划 B - 我们的 RDS 处于极光中,目前有写入器和读取器副本。客户愿意花钱升级,但不具备未来感,因为它不划算。 @JanLmpn - 详细说明您如何设想汇总表。我已经实现了好几次——开销很小。以上是关于基于 mysql 视图结果创建表以加快获取速度的主要内容,如果未能解决你的问题,请参考以下文章