不,在列上创建外键不会自动在该列上创建索引。在以下每种情况下,未能为外键列建立索引将导致表扫描:
- 每次从引用(父)表中删除一条记录。
- 每次将两个表连接到外键上。
- 每次更新FK列。
在此示例架构中:
CREATE TABLE MasterOrder (
MasterOrderID INT PRIMARY KEY)
CREATE TABLE OrderDetail(
OrderDetailID INT,
MasterOrderID INT FOREIGN KEY REFERENCES MasterOrder(MasterOrderID)
)
每当在MasterOrder表中删除一条记录时,都会扫描OrderDetail。每次您加入OrderMaster和OrderDetail时,也会扫描整个OrderDetail表。
SELECT ..
FROM
MasterOrder ord
LEFT JOIN OrderDetail det
ON det.MasterOrderID = ord.MasterOrderID
WHERE ord.OrderMasterID = @OrderMasterID
通常,不为外键编制索引比规则是例外。
不索引外键的情况是永远不会使用它。这将使服务器不必要的维护费用。类型表可能会不时地属于此类别,例如:
CREATE TABLE CarType (
CarTypeID INT PRIMARY KEY,
CarTypeName VARCHAR(25)
)
INSERT CarType .. VALUES(1,'SEDAN')
INSERT CarType .. VALUES(2,'COUP')
INSERT CarType .. VALUES(3,'CONVERTABLE')
CREATE TABLE CarInventory (
CarInventoryID INT,
CarTypeID INT FOREIGN KEY REFERENCES CarType(CarTypeID)
)
大致假设CarType.CarTypeID字段永远不会更新,删除记录几乎不会,因此,如果CarTypeID从未搜索过CarInventory,则不需要在CarInventory.CarTypeID上维护索引的服务器开销。