mysql为何不建议使用外键

MySQL中不建议使用外键的原因包括性能问题、外键设计限制、对拓展性的制约以及可用的逻辑外键解决方案。外键虽能保证数据一致性,但可能导致性能下降,且在热更新和分布式系统中可能造成不便。业界倾向于使用逻辑外键和程序控制来实现数据关联,以平衡性能和数据完整性。
摘要由CSDN通过智能技术生成

CSDN首页
博客
课程
文库·商城
问答
社区
插件
认证
开源
mysql为何不建议使用外键
搜索

会员中心
足迹
动态
消息
创作
mysql为何不建议使用外键_为什么很多mysql课程不推荐用物理外键?

大机灵聪明绝顶

于 2021-01-18 21:21:46 发布

1408
收藏
文章标签: mysql为何不建议使用外键
版权
刚好今晚有师弟问我这个问题,就来搜搜。以前我对这个也是蛮困惑的。这一年来对这个问题感受比较深。

用外键的好处我就不多说了,既然是关系型数据库,外键的约束为我们保证了数据主从关系和产生的先后关系,级联操作为我们的update和delete带来了不少方便。但成本是有的,你要权衡你是不是想付出这些代价。成本参考以下几点:

1.外键的性能问题

我刚写了一些,然后发现有人写的更好而且简洁,就引用吧:@mysqlops为何说外键有性能问题:

1.数据库需要维护外键的内部管理;

2.外键等于把数据的一致性事务实现,全部交给数据库服务器完成;

3.有了外键,当做一些涉及外键字段的增,删,更新操作之后,需要触发相关操作去检查,而不得不消耗资源;

4.外键还会因为需要请求对其他表内部加锁而容易出现死锁情况;

作者:mysqlops

链接:https://www.zhihu.com/question/19600081/answer/13295957

来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

总的来说物理外键是个比较“重”的实现,他会不顾性能不分轻重缓急的给你保证一致性。

2.mysql的外键设计问题

虽然很多人都不推荐你在关系型数据库使用外键。 但你更多听到的是mysql的,而不是SQLserver或者其他。比较公认的是,他的外键设计得的确不是很好,限制多功能不强大等,以innodb 为例子,包含但不限于以下几点(我认为比较严重的)所有tables必须是InnoDB型,它们不能是临时表。

在引用表中,必须有一个索引,外键列以同样的顺序被列在其中作为第一列。这样一个索引如果不存在,它必须在引用表里被自动创建。

不支持对外键列的索引前缀。这样的后果之一是BLOB和TEXT列不被包括在一个外键中,这是因为对这些列的索引必须总是包含一个前缀长度

InnoDB不对那些外键或包含NULL列的被引用键值检查外键约束

印象中轮子哥 @vczh 在回答一个跟存储过程有关的问题提到过,其他数据库不建议使用存储过程那是因为他们设计的不好,银行内不都比较推荐甚至要求sqlserver使用存储过程么(你没骗我吧)。反正我以前也是用sqlserver的,我觉得是挺好的。

3.外键对拓展性的限制和影响

外键的主从关系是定的,然后你会遵守这个规矩去干活。但是计划赶不上变化,万一哪天主键所在表需要拆分了呢?需要重构了呢?万一哪天你突然发现外键表不是非得跟主表的主键挂上关系呢?就我经历过的来看,这种情况并不少见,尤其是数据库设计者水平不够高的情况下。

另一方面,数据库帮你保证级联关系,你平时写程序的时候就真的思路清晰吗?因为某些原因(比如你想要的关系数据库不支持,mysql经常),有些地方你就不能设计外键了,当有级联更新的需要时,一部分靠物理外键,一部分还得靠自己,我觉得还不如全靠代码逻辑去保证。即使你对业务理解深刻,对外键也掌握的透彻,你也不太希望老是你管一部分他管一部分吧?

再放个大招,当你需要分库分表的时候,外键就浮云了。

4.逻辑外键在业界比较成熟

外键是个好东西,不使用物理外键,我们也可以约定逻辑外键(不在数据库声明FK,在程序实现上表达关联)

数据库上的策略:可以选择大多数情况下我们只更新不删除,也就是逻辑删,不再使用

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL可以添加外键,但是需要满足一些条件。首先,MySQL的存储引擎必须是InnoDB,因为只有InnoDB引擎支持外键约束。如果你的表使用的是其他存储引擎,如MyISAM,那么就无法添加外键。其次,你需要确保表之间的关联字段的数据类型和长度完全一致。另外,如果你要添加外键约束,被引用的表必须有一个主键或者唯一索引。如果你的表不满足这些条件,就无法添加外键约束。所以,如果你无法添加外键,可能是因为你的表使用的是不支持外键的存储引擎,或者表之间的关联字段不满足外键约束的条件。\[1\]\[2\]另外,虽然MySQL支持外键,但是有些人不推荐在关系型数据库中使用外键,因为MySQL外键功能相对较弱,限制较多,不如其他数据库如SQL Server等功能强大。\[3\] #### 引用[.reference_title] - *1* *2* [MySQL数据库不能添加外键的原因和解决办法](https://blog.csdn.net/qq_51533157/article/details/120680354)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [mysql为何不建议使用外键](https://blog.csdn.net/qq_40631247/article/details/124141073)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值