我被告知,如果我外键两个表,SQL Server将在子表中创建类似于索引的东西。我很难相信这是真的,但找不到太多与此相关的具体信息。
我问这个问题的真正原因是,对于一个可能有15个相关表的表,我们在delete语句中遇到了一些非常慢的响应时间。我问过我们数据库的人,他说如果字段上有外键,它就像一个索引。你在这方面有什么经验?我是否应该在所有外键字段上添加索引,或者它们只是不必要的开销?
我被告知,如果我外键两个表,SQL Server将在子表中创建类似于索引的东西。我很难相信这是真的,但找不到太多与此相关的具体信息。
我问这个问题的真正原因是,对于一个可能有15个相关表的表,我们在delete语句中遇到了一些非常慢的响应时间。我问过我们数据库的人,他说如果字段上有外键,它就像一个索引。你在这方面有什么经验?我是否应该在所有外键字段上添加索引,或者它们只是不必要的开销?
当前回答
SQL Server自动为主键创建索引,但不为外键创建索引。为外键创建索引。这可能是值得的。
其他回答
视情况而定。在MySQL中,如果你没有自己创建索引,就会创建索引:
MySQL要求外键列被索引;如果创建的表具有外键约束,但给定列上没有索引,则会创建索引。
来源:https://dev.mysql.com/doc/refman/8.0/en/constraint-foreign-key.html
MySQL 5.6也一样。
严格来说,外键与索引毫无关系。但是,正如我上面的演讲者指出的,创建一个加速fk查找是有意义的。事实上,在MySQL中,如果你没有在FK声明中指定索引,引擎(InnoDB)会自动为你创建索引。
在PostgeSql中,如果你点击\d tablename,你可以自己检查索引
您将看到,btree索引已经在具有主键和唯一约束的列上自动创建,但没有在具有外键的列上自动创建。
我认为这至少对研究生来说回答了你的问题。
SQL Server自动为主键创建索引,但不为外键创建索引。为外键创建索引。这可能是值得的。
外键是一种约束,是两个表之间的关系——本质上与索引无关。
但是,索引作为任何外键关系一部分的所有列非常有意义。fk关系通常需要查找相关的表,并根据单个值或一组值提取某些行。
因此,索引与FK有关的任何列是很有意义的,但FK本身并不是索引。
查看Kimberly Tripp的优秀文章“SQL Server何时停止在外键列上放置索引?”