Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 添加PKs&;有什么区别;FKs何时仍然可以在公共列上联接?_Mysql_Relational Database - Fatal编程技术网

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

我完全理解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> 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排
没有dude_id作为主键的表将产生1000000个键比较,也就是笛卡尔积。这是O(n^2)运行时间

使用dude_id作为主键的表将生成10000(1000 x 10(1000中的logbase2)个键比较。这是O(n logn)运行时间


除非主人id中的dude_id值分布不均匀(例如dude_id拥有50多只宠物),否则第二个布局应该始终轻松获胜。

运行时间是它们之间的差异

让我们假设如下

  • 索引查找是一种二进制搜索
  • 哥们有1000排
  • 宠物有1000排
没有dude_id作为主键的表将产生1000000个键比较,也就是笛卡尔积。这就是O(n^2)运行时间

使用dude_id作为主键的表将生成10000(1000 x 10(1000中的logbase2)个键比较。这是O(n logn)运行时间


除非主人id中的dude_id值分布不均匀(例如dude_id拥有50多只宠物),否则第二种布局应该会轻松获胜。

谢谢罗兰多这非常有用谢谢罗兰多这非常有用