在数据库字段上使用VARCHAR索引可以提高插入速度



我的数据库中有两个表:page和link。在每一个中,我定义URL字段是唯一的,因为我不想要重复的URL。

作为一个UNIQUE字段,它自动有一个索引?为这些字段创建索引可以加快插入速度吗?VARCHAR字段最合适的索引是什么?

有很多行会减慢插入速度,因为这个UNIQUE字段?目前,我有1,200,000行

是的,添加UNIQUE约束将创建一个索引:

添加唯一约束将自动在约束中使用的列或列组上创建唯一的b树索引。

这不会加快你的insert,但它实际上会减慢它们的速度:

  1. 必须检查每个插入(使用索引)以确保保持唯一性。
  2. insert也会更新索引,这不是免费的。

从逻辑上讲,约束是一回事,索引是另一回事。约束与数据完整性有关;索引与速度有关。

实际上,大多数dbms通过构建唯一索引来实现唯一约束。唯一索引可以让dbms更快地确定您要插入的值是否已经在表中。

我认为在VARCHAR()列上的索引可能会在某些情况下加快插入速度。但是通常索引会减慢插入,因为dbms必须

  • 检查所有约束,然后
  • 插入数据,最后
  • 更新索引

一个合适的索引将加速更新,因为dbms可以更快地找到需要更新的行。(但它也可能需要更新索引,这需要花费一些成本。)

PostgreSQL可以告诉你它正在使用哪些索引。看到解释。

通常b-tree/b+tree索引是最常见的索引,使用这些索引进行插入和更新很可能会比较慢,而选择单行、选择范围和ORDER BY(大多数情况下是升序)会非常快。这是因为这个索引是有序的,所以插入必须找到插入的位置,而不是直接插入到表的末尾。在聚集索引的情况下,由于页面分割,插入/更新更糟糕。

是唯一的可能会使它慢一点,因为它必须扫描更多的行来确保它是唯一的。

如果您正在寻找最佳性能,varchar通常不是索引的最佳选择,如果可以使用整数,则速度要快得多。所以对于varchar来说,真的没有"最好"的索引,每个索引都有自己的优点和缺点,并且总是有一个权衡。这真的取决于情况和你打算用它做什么,你只需要插入/更新吗?还是你也需要做出选择?这些都是你需要问的问题

最新更新