外键为空-性能下降

Jan*_*ane 1 mysql sql 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
....
)
Run Code Online (Sandbox Code Playgroud)

Dan*_*llo 5

是的,可以使外键接受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)
Run Code Online (Sandbox Code Playgroud)

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


更新:在下面进一步评论:

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