【问题标题】:Improve Database Table Design改进数据库表设计
【发布时间】:2021-12-03 04:54:41
【问题描述】:

我正在尝试设计一个数据库表,它将由服务 A 更新。另一方面,服务 B 将通过过滤一些行来读取数据。

下面是当前表的例子:

reference_id rent_id price date
1 5 8 2021-10-14
2 25 64 2021-10-13
3 125 512 2021-10-14
4 5 64 2021-10-14

顺便说一下,这里是创建表:

create table MyTable
(
    reference_id integer,
    rent_id integer,
    price integer,
    date date not null,
    constraint uniq_reference_id_rent_id_date
        unique (reference_id, rent_id, date)
);

create index ix_MyTable_date
    on MyTable (date);

而服务B中的数据是这样的:

 {date_1: [(reference_id_1, rent_id_1), (reference_id_2, rent_id_2), ...]}

所以有一个约束和一个与性能相关的问题。

  • 无法修改服务 B 中的数据。
  • 获取结果的 SQL 查询性能不佳。让我解释一下:

这里是查询:

SELECT * 
FROM MyTable
WHERE date = date_1 AND
         (reference_id = reference_id_1 AND rent_id = rent_id_1) OR
         (reference_id = reference_id_2 AND rent_id = rent_id_2) OR
         (reference_id = reference_id_3 AND rent_id = rent_id_3) OR
         ...

此查询在 PostgreSQL 10.14 上根本没有性能。而且我们还知道我们正在寻找这对夫妇的行 (reference_id_1,rent_id_1)可能不存在

所以我正在寻找不同的解决方案来重新设计我的桌子。一种解决方案是创建一个附加列,其中包含(reference_id_1,rent_id_1) 夫妇的哈希值

最后,我相信您的想法将使我能够改进我的同事提出的这个解决方案或找到另一个解决方案。

提前致谢。

【问题讨论】:

  • 您是否正确使用索引来解决性能问题?
  • 两列(reference_id_1,rent_id_1)已经被索引了。
  • 也尝试将索引放在日期上。也使用解释看看 Postgres 是如何工作的。评估使用多列索引以供参考和出租。尝试考虑日期上的哈希索引是否是正确的选择
  • 为了帮助您解决query-optimization 的问题,我们通常需要更多信息。请read this,然后edit您的问题。
  • 感谢您的反馈。该问题已使用创建表示例进行了编辑。 O.jones

标签: python database postgresql database-design query-optimization


【解决方案1】:

你的桌子设计很好。您需要multicolumn index 来帮助您满足此查询。不需要为此使用哈希值列。

我推荐这个。

 CREATE INDEX ref_rent_date
     ON TABLE MyTable
  USING BTREE (reference_id, rent_id, date);

我建议将您的 date 列放在索引的最后,这样您就可以使用它来搜索日期范围 (WHERE date >= '2021-01-01') 以及您向我们展示的查询模式中的特定日期。

专业提示:不要创建大量单列索引,除非您知道您的查询模式需要它们,或者您知道您需要它们用于 UNIQUE 约束等。大多数在 WHERE 子句中包含多个项目的查询在创建多列索引以匹配查询模式时会做得更好。

专业提示 2 随着应用程序及其表的增长,通常需要添加新索引以匹配实际查询模式。 SQL 被设计成可以在不影响数据的情况下添加和删除索引。

阅读 Marcus Winand 的 https://use-the-index-luke.com

【讨论】:

    猜你喜欢
    • 2013-12-09
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    • 2015-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多