mysql - 基于 mysql 视图结果创建表以加快获取速度
问题描述
所以我们的网站有不断增长的数据,我们通常使用 mysql 视图来查看记录列表,以便我们可以简化代码中的选择查询。从那以后一直是这种做法,但是随着时间的推移,这些需求给 SQL 视图带来了很多复杂性,比如 sum、count of 等。所以我们的大多数视图都相对较慢。
为了保留在 MySQL 视图中创建的逻辑(因为这是我们的客户偏好),我们确实尝试了以下操作:
选项 1 是:
- 启动 RDS 2
- 从我们的 RDS 1 的视图中选择 *
- 插入 RDS 2 中的所有结果
- 连接列表 API 以从 RDS 2 获取数据
使用#4,它返回很快,因为数据库不会重新计算总和,不再计数,我们只需要获取结果。#2 & #3:
- 我们的 API 服务器正在运行 nodejs,它连接到这两个数据库。
- 我每个列表/表只保存 1000 个。因此,如果我有 6 个视图 = 正在创建 6 个平面表。
- 至少每分钟发生一次。在重复整个过程之前,我们实施了一个标志来检查是否有正在进行的过程。
这个选项的问题:它使我们的 RDS 1 和 API 服务器紧张。
选项 2 是:
- 在同一个 RDS 1 上创建另一个表
- 插入到从 sql 视图中选择
- 连接列表 API 以从创建的平面表中获取数据
此选项的问题:尚未在我们的测试环境中测试它,但在我的本地当 #2 进行时,无法更新某些表行并且我遇到死锁错误。
不确定我是否走在正确的轨道上,或者除了重新编码或修复我们的数据库结构或完全不使用 MySQL 视图之外,这是否还有解决方案。
先感谢您。
解决方案
“总和、计数等”——这有点像针对数据仓库中的大型“事实”表的“报告”。
计划 A——汇总表
如果数据是静态的(插入后),则构建和维护汇总表。这将更快,更高效。您仍然可以在必要的 `SELECTs 之前放置一个VIEW
或。Stored Proc
此类摘要表将存在于同一实例上,并且可能仅占用 20% 的额外磁盘空间。而且,由于它们的运行速度非常快,因此无需设置另一台服务器。 http://mysql.rjweb.org/doc.php/summarytables
VIEWs
是语法糖。它们从不(?)比底层更快SELECT
,有时更慢。正如您的客户所说,它们确实使查询更容易。
B计划——复制
处理太多查询(与处理慢查询相反)的另一种方法是使用“复制”。写入到主节点并被复制到副本节点。您VIEWs
可以点击副本,因为它们(我假设)是只读的。可以添加任意数量的副本,从而实现“无限”缩放。
(A和B都可以。)
推荐阅读
- python - 在 python 中使用正则表达式替换时忽略特殊字符
- javascript - 检测反应组件中的断开链接
- php - mysql和php中同一行中所有行的总和如何
- pandas - 访问对象时,“浮动”对象不是可下标的错误
- c# - 当实例化一个 Prefab 的多个 GameObjects 时,只有最后一个创建的按钮起作用
- c# - 我有一个统一项目,我在其中使用颜色,但我需要一些帮助
- javascript - 强制刷新和清除缓存 - ReactJS
- python - pycharm 编码错误信息。numpy.ndarray
- angular - 仅针对一个用户的随机 CORS 预检问题
- javascript - NextJS | getStaticProps 在构建时失败