Mysql 添加PKs&;有什么区别;FKs何时仍然可以在公共列上联接?
我完全理解PKs和FKs的必要性,但是在使用关系数据库时。但是当从终端使用Mysql时。当您可以在公共列上进行连接时,添加PKs和FKs有什么区别 如果我创建表Mysql 添加PKs&;有什么区别;FKs何时仍然可以在公共列上联接?,mysql,relational-database,Mysql,Relational Database,我完全理解PKs和FKs的必要性,但是在使用关系数据库时。但是当从终端使用Mysql时。当您可以在公共列上进行连接时,添加PKs和FKs有什么区别 如果我创建表 mysql> create table dudes (dude_id int, name varchar(30), age int); mysql> create table pets (pet_id int, owner_id int, address varchar(30)); 与此相反 mysql> creat
mysql> create table dudes (dude_id int, name varchar(30), age int);
mysql> create table pets (pet_id int, owner_id int, address varchar(30));
与此相反
mysql> create table dudes (dude_id int primary key, name varchar(30), age int);
mysql> create table pets (pet_id int primary key, owner_id int references(dude_id), address varchar(30));
我仍然可以正确地联接每个表并执行所有需要的操作。MySQL在后台还做了什么,通过显式添加PK和FK引用使我的生活更轻松
SELECT *
From dudes d
JOIN pets p ON d.dude_id=p.own_id;
在MySQL中,主键是自动索引的——使用索引连接行将比顺序读取表中的所有数据快在MySQL中,主键是自动索引的——使用索引连接行将比顺序读取表中的所有数据快实际上,它做了很多事情。主键将在该键上创建和索引,以加快查找速度 编辑:添加主键基本上是必要的。对于任何大小的数据库,这都将为您带来重大的性能提升。另一方面,设置外键更多的是一个意见问题 维护外键的目的是支持RDM的关系方面。通过显式定义这些关系,可以使这些字段中不能放入任意值 此外,如果您选择实现它们,您可以执行诸如级联更新和删除之类的操作。这样可以确保删除记录时,所有关联数据(取决于它们的关系)也会被删除
还有一些不实现外键的原因。它们增加了开销,同样的逻辑可以在代码中维护。事实上,它做了很多事情。主键将在该键上创建和索引,以加快查找速度 编辑:添加主键基本上是必要的。对于任何大小的数据库,这都将为您带来重大的性能提升。另一方面,设置外键更多的是一个意见问题 维护外键的目的是支持RDM的关系方面。通过显式定义这些关系,可以使这些字段中不能放入任意值 此外,如果您选择实现它们,您可以执行诸如级联更新和删除之类的操作。这样可以确保删除记录时,所有关联数据(取决于它们的关系)也会被删除
还有一些不实现外键的原因。它们增加了开销,代码中可以保持相同的逻辑。PK总是被索引,因此当表增长时,搜索速度将加快几个数量级。 FK将确保,如果要中断或不满足依赖关系,请求将中断或操作受控自动操作(级联) Ie:如果您添加了一只宠物,但它没有有效的关联dude:FK将中断请求尝试,并发出一个错误
如果你删除了一个有宠物的家伙,如果设置了,层叠可以自动删除相关的宠物行。PK总是被索引的,因此当表增长时,搜索速度将加快几个数量级。 FK将确保,如果要中断或不满足依赖关系,请求将中断或操作受控自动操作(级联) Ie:如果您添加了一只宠物,但它没有有效的关联dude:FK将中断请求尝试,并发出一个错误
如果你删除了一个有宠物的家伙,如果设置了,级联可以自动删除相关的宠物行。运行时间是它们之间的差异 让我们假设如下
- 索引查找是一种二进制搜索
- 哥们有1000排
- 宠物有1000排
除非主人id中的dude_id值分布不均匀(例如dude_id拥有50多只宠物),否则第二个布局应该始终轻松获胜。运行时间是它们之间的差异 让我们假设如下
- 索引查找是一种二进制搜索
- 哥们有1000排
- 宠物有1000排
除非主人id中的dude_id值分布不均匀(例如dude_id拥有50多只宠物),否则第二种布局应该会轻松获胜。谢谢罗兰多这非常有用谢谢罗兰多这非常有用