专注Java教育14年 全国咨询/投诉热线:400-8080-105
动力节点LOGO图
始于2009,口口相传的Java黄埔军校
首页 hot资讯 浅谈MySQL外键约束的问题

浅谈MySQL外键约束的问题

更新时间:2021-01-12 17:49:44 来源:动力节点 浏览1010次

外键约束是为了保持子表与父表的数据一致,用于在两个表之间建立关系,需要指定引用主表的哪一列。InnoDB是MySQL内置存储引擎中唯一一个支持外键的。InnoDB会强制外键使用索引。事实上,我们每次做DELETE 或者UPDATE都必须考虑外键约束,会导致开发的时候很痛苦,测试数据极为不方便。本文我们就来探讨一下MySQL外键约束的问题

 

首先我们明确一点,外键约束是一种约束,这个约束的存在,会保证表间数据的关系“始终完整”。因此,外键约束的存在,并非全然没有优点。比如使用外键,可以保证数据的完整性和一致性级联操作方便将数据完整性判断托付给了数据库完成,减少了程序的代码量然而,鱼和熊掌不可兼得。外键是能够保证数据的完整性,但是会给系统带来很多缺陷。正是因为这些缺陷和问题,才导致我们不推荐使用外键,MySQL外键约束带来的问题具体如下4个,我们来详细学习一下:

 

1.性能问题

假设一张表名为user_tb。那么这张表里有两个外键字段,指向两张表。那么,每次往user_tb表里插入数据,就必须往两个外键对应的表里查询是否有对应数据。如果交由程序控制,这种查询过程就可以控制在我们手里,可以省略一些不必要的查询过程。但是如果由数据库控制,则是必须要去这两张表里判断。

 

2.并发问题

在使用外键的情况下,每次修改数据都需要去另外一个表检查数据,需要获取额外的锁。若是在高并发大流量事务场景,使用外键更容易造成死锁。

 

3.扩展性问题

做平台迁移方便,比如你从Mysql迁移到Oracle,像触发器、外键这种东西,都可以利用框架本身的特性来实现,而不用依赖于数据库本身的特性,做迁移更加方便。

分库分表方便,在水平拆分和分库的情况下,外键是无法生效的。将数据间关系的维护,放入应用程序中,为将来的分库分表省去很多的麻烦。

 

4.技术问题

使用外键,其实将应用程序应该执行的判断逻辑转移到了数据库上。那么这意味着一点,数据库的性能开销变大了,那么这就对DBA的要求就更高了。很多中小型公司由于资金问题,并没有聘用专业的DBA,因此他们会选择不用外键,降低数据库的消耗。
相反的,如果该约束逻辑在应用程序中,发现应用服务器性能不够,可以加机器,做水平扩展。如果是在数据库服务器上,数据库服务器会成为性能瓶颈,做水平扩展比较困难。

 

除此之外,使用mysql外键约束是有成本的,因为每次修改数据都要在另外一个表中执行查询操作,虽然如上面所说,外键字段有索引,但还是会带来额外的开销。这些开销跟外键上的索引有很大关系,一般外键列的选择性很低,就会产生一个非常大但是选择性低的索引,那么这个索引除了做外键限制,没有其他的用处,维护这样的索引显然不是高效的做法。因此,我们在日常使用MySQL的过程中,并不推荐使用外键约束。想要深入学习MySQL的各种机制,可以观看本站的MySQL教程,体验不一样的学习之旅。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>