InnoDB 是MySQL中唯一支持外键约束的内置引擎
缺点
多一次查询
在每次修改数据时,都要在另外一张表执行一次查询操作,如果外键列的选择性很低,会导致存在一个很大但是选择性很低的索引。
比如在一个很大的users表中,有一个 status 列,该列只有2个值,虽然列本身很小,但是如果主键很大,那么这个索引就会很大,而这个索引除了做外键限制,也没有其他作用了
外键维护效率低
在外键相关数据的更新和删除时,外键的维护时逐行进行的,比批量删除和批量更新效率低
额外的锁等待
外键约束使查询需要访问一些额外的表,就意味着需要额外的锁:比如 学生表有一列存储班级的主键,当新增一条学生记录时,需要在对应班级的行加锁,防止在事务结束前,该班级被删除。这会导致额外的锁等待,甚至死锁。由于没有直接访问该表,往往难以排查该问题
优点
- 保持数据一致性时,比在应用中做效率高
总结
有时可以使用触发器做外键约束,对于相关数据的同时更新,外键更合适,但是如果只对列做数值约束,使用触发器或者限制取值会更好,
如果只是做外键约束,在应用程序内做会更好,外键会带来很大的额外消耗,往往会成为性能瓶颈