优化此数据库数据模型

问题描述 投票:0回答:1

我是一名后端开发人员,最近必须优化搜索实现。该数据库有许多用于搜索的表,大约有 7 个表,每个表包含大约 50k-500k。桌子看起来像这样。

the data model

您还可以假设所有有名称的东西也有 ts_vector 作为其名称。如果我提供的图表不清楚,我很抱歉。

以下是有关系统的一些假设。我在实施系统时必须遵循这些。但您可以向我们推荐一些服务。如果你愿意的话。

  1. 数据库是亚马逊管理的RDS实例。因此,改变共享内存、共享缓冲区等配置是完全不可能的。
  2. 使用外部服务也是不可能的,因为这会增加我们的云成本
  3. 我们有只读副本设置。
  4. 我确实有 Redis 集群设置。

这里有一些全局约束 只显示项目

  1. is_active=真
  2. 净库存 > 0
  3. 有图像
  4. 有_url_路径

我的数据的访问模式如下

  1. 通过外部变体 ID 获取单个变体
  2. 通过外部项目 ID 获取多种变体 通过使用类别获得许多变体。可以使用以下方式触发类别 我。如果类别和用户查询相似,则使用 TS_Search @> 操作并且属于当前网站区域设置 二.如果用户的输入与类别名称类似匹配 三.如果用户的输入与外部类别id匹配
  3. 按名称查找许多变体ILIKE
  4. 如果变体的选择或属性与用户的输入相似,则查找变体。使用 TS_Vector
  5. 通过描述找到许多变体 TS_Vector
  6. 无论获取什么变体,我都必须按变体位置降序对它们进行排序。

让我向您解释解释统计数据

  1. 大部分解释成本花在排序部分。使用的算法是外部合并排序。
  2. 正确使用索引
  3. 使用的连接算法是嵌套循环连接

本地主机中的平均搜索查询大约需要 5-6 秒。可能是因为需要进行多次连接和 7 个不同的查询才能获取总数据。

The datamodel after

我必须遵循一些 NoSQL 原则,并且必须大量使用 JSONB 列,以下是我如何使用按位置值降序排序的物化视图来改进它。由此创建的物化视图看起来像这样,严重非规范化并使用 JSONB 列减少连接。物化视图对我们来说没问题,因为我们的数据刷新不多,定期 12 小时刷新对我们来说就足够了。

请注意我如何将所有内容添加到一张表中。 JSONB 列是一个救星。现在搜索查询大约为 600 毫秒。

刷新物化视图时搜索服务关闭。目前只读副本可以帮助我们实现这一点。

现在,我正在尝试从系统中删除只读副本。已设置备份并设置备用 rds。您有什么建议吗??

mysql postgresql relational-database data-modeling
1个回答
0
投票

但是,我需要有关您当前数据模型的更多信息。请提供以下详细信息:

  1. 数据库类型(关系型、NoSQL 等)
  2. 现有表结构(架构)
  3. 表之间的关系
  4. 数据类型和约束
  5. 查询和用例(例如插入、更新、选择)
  6. 性能问题或挑战

有了这些信息,我可以提出优化建议,例如:

  • 规范化和非规范化
  • 索引和缓存
  • 表拆分或合并
  • 数据类型优化
  • 查询优化
  • 可扩展性和分区策略

请提供必要的详细信息,我将帮助您优化数据库数据模型。

示例格式

CREATE TABLE users (
  id INT PRIMARY KEY,
  name VARCHAR(255),
  email VARCHAR(255)
);

CREATE TABLE orders (
  id INT PRIMARY KEY,
  user_id INT,
  order_date DATE
);
© www.soinside.com 2019 - 2024. All rights reserved.