外键
InnoDB是目前MySQL中唯一支持外键的内置存储引擎,外键引用的列应该具有逐渐约束或者唯一性约束。
使用外键的成本:
- 外键通常要求每次在修改数据时都要在另外一张表多执行一次查找操作。
- 虽然外键有索引,但是如果选择性外键列选择性比较低,其实索引无意义。
- 如果向字表中写入一条记录外键约束会让InnoDB检查对应的父表的记录,也就需要对父表对应记录进行加锁操作,来确保这条记录不会再这个事务完成之时就被删除了。这会导致额外的锁等待,甚至会导致一些锁。因为没有直接访问这些表,这类死锁问题往往难排查。
外键的优点
- 如果想要确保两个相关表始终有一致的数据,那么使用外键比在应用程序中检查一致性的性能要高得多。
- 外键在相关数据的删除和更新上,也比在应用中维护要更高效。
建议:
- 有时可以使用触发器来代替外键:对于相关数据的同时更新更新使用外键是合适的,但是如果外键只是用作数值约束,那么触发器或者显式地限制取值会更好些。(可以直接使用ENUM类型)。
- 外键只做约束,在应用程序中实现该约束更好。