mysql - 从与父表具有外键约束的子表中删除记录的成本是多少

标签 mysql database hibernate jpa hibernate-mapping

例如,有 20 个表,其中一个表具有外键,我们将其称为“子表”。现在,当我从 Child 中删除一条记录时,它会检查该记录是否是从某处引用的,是这样还是其他情况。 我的问题是这个外键关系如何影响删除操作的性能。

实际上我正在使用 hibernate,并且我有一个实体,它只有 3 列,并且用于许多其他实体(一对一)映射。 我正在考虑使这个实体可嵌入以进行性能调整,因为如果我保留它的实体,那么表之间的映射是使用外键完成的。尽管当我删除一个实体时,只有两个查询正在运行:删除父级,然后删除子级。但由于child的外键是从许多其他有大量记录的表中引用的,因此它会检查某些表中是否存在对child中记录的引用,如果不存在,则在删除child记录时删除。因此,我想通过使子项可嵌入来解决这个问题,这将导致子项的列将包含在父表中。这是否有帮助?

最佳答案

性能很大程度上取决于您使用的 DBMS、表的设计、索引和存储方式以及您拥有的数据量。

一般来说,外键约束可以节省时间和精力并防止错误。如果没有外键约束,您就必须自己强制执行完整性。

例如,手动级联删除或更新将在数据库的多次往返中完成,这通常包含在事务中。手动检查相关记录以限制更改还需要在服务器和客户端之间传输额外的查询和数据。

如果您错过了任何内容,或者其他用户在查询之间修改了相关数据,您最终可能会得到无效数据,这可能会造成高昂的代价 - 无论是在 DBA 时间还是客户满意度方面。

关于mysql - 从与父表具有外键约束的子表中删除记录的成本是多少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37406612/

相关文章:

php - MySQL 查询合并两个表以获得单个结果

mysqldump : Couldn't execute. information_schema 中的未知表 'column_statistics'

android - 需要逐步过程才能在android中使用sqlite数据库

java - 写入数据库表

Qt 的 Mysql 插件

mysql - Precision MySql 中的除法

database - Visual Studio 2010 数据比较自动化

java - Hibernate 外键上的一对一单向

database - 如何在 Spring MVC Controller 中显示来自数据库的表

java - 删除未保存的对象不会引发异常