我的数据库中有两个表:page和link。在每一个中,我定义URL字段是唯一的,因为我不想要重复的URL。
作为一个UNIQUE字段,它自动有一个索引?为这些字段创建索引可以加快插入速度吗?VARCHAR字段最合适的索引是什么?
有很多行会减慢插入速度,因为这个UNIQUE字段?目前,我有1,200,000行
是的,添加UNIQUE约束将创建一个索引:
添加唯一约束将自动在约束中使用的列或列组上创建唯一的b树索引。
这不会加快你的insert,但它实际上会减慢它们的速度:
- 必须检查每个插入(使用索引)以确保保持唯一性。
- insert也会更新索引,这不是免费的。
从逻辑上讲,约束是一回事,索引是另一回事。约束与数据完整性有关;索引与速度有关。
实际上,大多数dbms通过构建唯一索引来实现唯一约束。唯一索引可以让dbms更快地确定您要插入的值是否已经在表中。
我认为在VARCHAR()列上的索引可能会在某些情况下加快插入速度。但是通常索引会减慢插入,因为dbms必须
- 检查所有约束,然后
- 插入数据,最后
- 更新索引
一个合适的索引将加速更新,因为dbms可以更快地找到需要更新的行。(但它也可能需要更新索引,这需要花费一些成本。)
PostgreSQL可以告诉你它正在使用哪些索引。看到解释。
通常b-tree/b+tree索引是最常见的索引,使用这些索引进行插入和更新很可能会比较慢,而选择单行、选择范围和ORDER BY(大多数情况下是升序)会非常快。这是因为这个索引是有序的,所以插入必须找到插入的位置,而不是直接插入到表的末尾。在聚集索引的情况下,由于页面分割,插入/更新更糟糕。
是唯一的可能会使它慢一点,因为它必须扫描更多的行来确保它是唯一的。
如果您正在寻找最佳性能,varchar通常不是索引的最佳选择,如果可以使用整数,则速度要快得多。所以对于varchar来说,真的没有"最好"的索引,每个索引都有自己的优点和缺点,并且总是有一个权衡。这真的取决于情况和你打算用它做什么,你只需要插入/更新吗?还是你也需要做出选择?这些都是你需要问的问题