我有一个postgres数据库,它有大约name,000行和许多(大约60)列.感兴趣的列是namecategory,两者都是varchars.

create table items
(
    id uuid,
    name varchar(256),
    category varchar(256),
    data varchar(256)[],
    ...
)

我的应用程序经常发出以下查询

  1. select * from items where name = 'name';
  2. select * from items where category = 'category';
  3. select * from items where name = 'name' and category = 'category';
  4. `SELECT*FORM ITEMS WHERE id=‘id’;

更不常见的是

  1. select * from items where 'data' = ANY(data);

为这些数据编制索引以最大化效率的最佳方式是什么?我应该在两个列上都有一个索引吗?如果是,按什么顺序?

namecategory列都不能保证是唯一的.我估计大约有name0个类别和大约40,000个唯一的名字.

推荐答案

在这里,您将需要单独的索引.查询%1不能使用前导为category的索引,查询%2不能使用前导为name的索引.查询5也是如此.

查询3需要多列索引.剩下的唯一问题是将额外的列添加到其中的哪一个.看看哪一列更有 Select 性,在本例中是name.

查询4可以使用主键索引.假设id是主键,则应该将其声明为主键.

查询5需要data上的另一个索引.我相信这一定是一个杜松子wine 指数,而且你可能需要把ANY改为@>.

因此,您有三个独立的索引.

(name, category)
(category)
(data)  -- needs to be a GIN index.

60列非常宽(可能太宽了,这是标准化不好的标志),而且您还要执行select *列,因此不可避免地要进行键查找.因此,没有必要使用INCLUDE列.


仅当这些是唯一执行的查询时,所有这些才适用.否则需要进一步分析:您可能需要INCLUDE列,或者可以向键添加其他列.

Sql相关问答推荐

从以前的非空值行中获取值

如果开始期间不存在PostgresSql回填数据

如何嵌套两条SQL语句

Ffltter&;Dart SQL Lite包:是否可以在一个查询中执行多条更新语句(每次执行不同的WHERE参数)

你能过滤一个列表只返回多个结果吗?

用于过滤嵌套对象或数组中的JSON数据的WHERE条件

从数据库中查找总和大于或等于查询中的数字的数字

基于多参数的SQL Server条件过滤

在SQL GROUP BY中的某些行之后执行计算

用于从第二个表中提取具有最小最终价格值的记录的SQL查询

按两列分组,并根据SQL中的条件返回第三个列值

优化Postgres搜索未知长度的子串

用于SQL协助的XQUERY()

将用户授予另一个用户不授予权限

从每月生成的系列中生成每日汇率

如何将 START 和 END 日期之间的日期差异作为 SQL 中的单独列获取

基于 Snowflake 的最大值创建新列

计算 SQL 中的总体成功率:递归 CTE 还是替代方法?

使用 SQL 表中的连接列删除重复记录

使用 json_agg 从 SQL 查询获取 [null] 响应