mysql外键约束_mysql 外键约束

前面我们说到视图,视图对性能是有提升的,但是前提是经过详细的性能测试,视图表面上很简单,但是其内部的逻辑还是很复杂的,一个简单的查询可以也可能会有很复杂的处理逻辑。所以还是要谨慎使用。

外键约束是为了保持子表与父表的数据一致。InnoDB是mysql内置存储引擎中唯一一个支持外键的。InnoDB会强制外键使用索引。

使用外键是有成本的,因为每次修改数据都要在另外一个表中执行查询操作,虽然如上面所说,外键字段有索引,但还是会带来额外的开销。这些开销跟外键上的索引有很大关系,一般外键列的选择性很低,就会产生一个非常大但是选择性低的索引,那么这个索引除了做外键限制,没有其他的用处,维护这样的索引显然不是高效的做法。

但是外键如果是用做保持数据表的数据一致性,性能会比在应用层面做一致性检测要高得多。并且在做数据删除和更新上,会比在应用程序中维护要高效。但是外键维护是逐行进行的,所以这样的更新会比批量删除和批量更新慢些。

外键约束带来的开销还包括锁开销,比如向子表中添加一条数据,外键约束会让innodb检查对应的父表。这里会需要对父表进行加锁操作,来确保这条记录不会在事务完成之前被删除。这就带来了额外的锁开销。甚至死锁。

有一种情况可以避免使用外键约束,就是当仅仅为了做约束时,使用触发器代替外键或者在程序中实现约束都比使用外键要更好,当要在保持数据同步更新这种情况下,外键是个不错的选择。

创建外键约束举例:

表profile 中的uid字段与表user 中的id字段做外键约束。

alter table profile add constraint fk_id(外键名称) foreign key uid references user(id);

删除外键:

alter table table_name drop foreign key key-id(外键名);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值