首页 > 解决方案 > 基于 mysql 视图结果创建表以加快获取速度

问题描述

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

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

选项 1 是:

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

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

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

选项 2 是:

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

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

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

先感谢您。

标签: mysqlnode.jsamazon-web-servicesamazon-rds

解决方案


“总和、计数等”——这有点像针对数据仓库中的大型“事实”表的“报告”。

计划 A——汇总表

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

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

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

B计划——复制

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

(A和B都可以。)


推荐阅读