我很好奇

CREATE INDEX idx ON tbl (columns);

与.

CREATE UNIQUE INDEX idx ON tbl (columns);

在PostgreSQL或MySQL实现中,当扫描索引列时,或者UNIQUE关键字是否只是在索引旁边引入了唯一约束时,具有显著的算法性能优势.

我想可以公平地说,只要索引可能在内部实现为某种类似哈希1的 struct ,并且冲突处理根据定义会产生O(1)性能以外的结果,那么这可能是一种边际效益.鉴于这一前提,如果很大一部分值是相同的,那么 struct 很可能退化为线性.

所以,为了我的问题,假设值的分布是relatively个离散且均匀的.

提前谢谢!

1这对我来说纯粹是猜测,因为我不熟悉RDBM的内部 struct

推荐答案

如果你的数据是唯一的,你应该为它们创建一个UNIQUE索引.

这意味着没有额外的开销,并且在某些情况下会影响优化器的决策,以便它可以 Select 更好的算法.

例如,在SQL ServerPostgreSQL中,如果按UNIQUE键排序,优化器会忽略后面使用的ORDER BY子句(因为它们是无关的),即此查询:

SELECT  *
FROM    mytable
ORDER BY
        col_unique, other_col
LIMIT 10

将使用col_unique上的索引,而不会按other_col排序,因为这是无用的.

此查询:

SELECT  *
FROM    mytable
WHERE   mycol IN
        (
        SELECT  othercol
        FROM    othertable
        )

如果othertable.othercol上的索引为UNIQUE,则也将转换为INNER JOIN(而不是SEMI JOIN).

索引总是包含某种指向行的指针(PostgreSQL中的ctidMyISAM中的行指针,InnoDB中的主键/uniquifier),并且叶子在这些指针上是有序的,所以实际上每个索引叶子在某种程度上是唯一的(尽管它可能并不明显).

有关性能详细信息,请参阅我博客中的这篇文章:

Postgresql相关问答推荐

跟踪状态更改为特定值的日期

为什么我的应用程序接收的是空值而不是布尔值?

如何删除Devtainer之前创建的PostgreSQL数据库?

Gorm 中的更新将created_at、updated_at 作为默认时间

为什么我的唯一索引在 Postgresql 中不起作用?

Gorm 创建表单数据文件上传错误

需要用 jack/pgx 更新 golang 中复合类型的 PSQL 行

是否可以调整 PostgreSQL 中的数组以适应 IN 运算符?

GORM 不会创建 many2many 关联

Postgis 不只使用索引扫描

如何从元组列表中 Select 与多列匹配的行?

timezone date_trunc 函数

Postgres 在 WHERE id != int 查询中排除 NULL

如何在 PostgreSQL 中插入多行

如何使用 Node.js 和 Postgresql 找到最后一个插入 ID?

按任意时间间隔计算行数的最佳方法

如何使用 sql 或 phpPgAdmin 更改 PostgreSQL 数据库的数据库编码?

如何在 postgresql 中获取整个表的哈希?

PostgreSQL 无法启动:server.key具有组或世界访问权限

如何查询前 10 行,下一次从表中查询其他 10 行