postgresql - 在索引列上优化使用 LIKE

标签 postgresql database-design

我有一个大表(+- 100 万行,7 列,包括主键)。该表包含两列(即:symbol_01symbol_02),它们已建立索引并用于查询。该表包含以下行:

id    symbol_01    symbol_02   value_01  value_02
1     aaa          bbb         12        15
2     bbb          aaa         12        15
3     ccc          ddd         20        50
4     ddd          ccc         20        50

根据示例,第 1 行和第 2 行是相同的,只是 symbol_01symbol_02 交换了,但它们的 value_01value_02。第 3 行和第 4 行也是如此。整个表格都是如此,symbol_01+symbol_02 的每个组合本质上都有两行。

我需要找到一种更好的方法来处理这个问题以消除重复。到目前为止,我正在考虑的解决方案是只有一列名为 symbol 的列,它是两个符号的组合,因此表格如下:

id    symbol       value_01   value_02
1     ,aaa,bbb,    12         15
2     ,ccc,ddd,    20         50

这会将行数减少一半。附带说明一下,symbol 列中的每个值都是唯一的。总是需要查询使用这两个符号的结果,所以我会这样做:

select value_01, value_02
from my_table
where symbol like '%,aaa,%' and symbol like '%,bbb,%'

这可行,但我的问题是关于性能的。这仍然是一张大 table (并且很快就会变得更大)。所以我的问题是,鉴于 symbol 将被索引,每个 symbol 组合都是唯一的,并且我需要使用 LIKE 查询结果。

有更好的方法吗?我不确定 LIKE 对性能有多大影响,但我没有看到替代方案?

最佳答案

没有高性能的解决方案,因为您的问题是将多个值硬塞到一列中。

创建一个子表(带有当前/主表的外键)来单独保存您想要搜索的所有单个值,为该列建立索引,您的查询将很简单>而且快。

关于postgresql - 在索引列上优化使用 LIKE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38882700/

相关文章:

java - 如何使用 Hibernate @ColumnTransformer 加密 Postgres 中的列

design-patterns - 您可以使用键值存储作为应用程序的主数据库吗?

database - 关联数据库中的两个表

sql - 如何证明在 SQL 中使用子选择查询会降低服务器的性能

postgresql - Postgres : Calculating the number of working months in the last X years

database - postgresql 中的指数问题

ruby-on-rails - 用于 postgresql 的 Ruby on Rails : How can I edit database. yml?

mysql - 如何在像 MySQL 这样的 RDBMS 中存储双向关系?

python - 具有不同数据类型的一个字段 [SQLAlchemy]

sql - Postgresql - 选择日期 = "01/01/11"的内容