外键null - 性能下降

时间:2010-10-22 17:38:42

标签: sql mysql foreign-keys

我有表文件夹,其中列parent_id引用id,如果该文件夹具有父文件夹,如果不是则则parent_id为null。这是可行的解决方案还是我需要额外的表来进行此连接或其他解决方案?外键是否可以为null,如果可以,这个解决方案会有更长的执行时间吗?

table folder(
   id int primary key,            //primary key in my table
   parent_id int references id,   //foreign key on id column in same table
....
)

2 个答案:

答案 0 :(得分:4)

是的,可以使用外键接受NULL值:

CREATE TABLE folders (
   id           int   NOT NULL   PRIMARY KEY, 
   parent_id    int   NULL, 
   FOREIGN KEY (parent_id) REFERENCES folders (id)
) ENGINE=InnoDB;
Query OK, 0 rows affected (0.06 sec)

INSERT INTO folders VALUES (1, NULL);
Query OK, 1 row affected (0.00 sec)

如果外键设置为接受NULL值,则执行时间不受影响。


更新:继续在下面发表评论:

请记住,B树索引对于高基数数据(即具有许多可能值的列,其中列中的数据是唯一的或几乎唯一的)最有效。如果您将有许多NULL值(或任何其他重复值),查询优化器可能会选择不使用索引来过滤结果集的记录,因为它不会更快。但是,此问题与列是否为外键的事实无关。

答案 1 :(得分:2)

您可以拥有NULL个外键。没问题。我不会为没有父级(根文件夹)的文件夹添加额外的表。这将使您的设计更加复杂,没有任何好处。