添加PKs和放大器有什么区别? FK,你仍然可以加入一个共同的列?

时间:2012-03-14 17:00:32

标签: mysql relational-database

我完全理解PK和FK的需要,但在使用关系数据库时。但是当从终端使用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;

4 个答案:

答案 0 :(得分:2)

实际上它做了很多。主键将在该键上创建和索引,以使查找更快。

编辑:添加主键基本上是必需的。使用任何显着大小的数据库,这将为您带来重大的性能提升。另一方面,设置外键更多的是意见问题。

维护外键的关键是支持RDMS的关系方面。通过明确定义这些关系,您可以将其设置为不能将任意值放入这些字段中。

此外,如果您选择实施它们,则可以执行级联更新和删除等操作。这些确保在删除记录时,所有相关数据(取决于它们的关系)也会被删除。

还有理由不实现外键。它们增加了开销,并且可以在代码中维护相同的逻辑。

答案 1 :(得分:1)

在MySQL中,主键自动编入索引 - 使用索引连接行将比顺序读取表的所有数据更快

答案 2 :(得分:1)

PK始终被编入索引,因此当表格增长时搜索速度会快几个数量级。 FK将确保如果要破坏或不履行依赖关系,请求将中断或操作受控自动操作(CASCADE)

即:如果你添加一只宠物并且它没有有效的关联伙伴:FK会破坏发出错误的请求尝试 如果你删除了一个有宠物的家伙,如果设置了,CASCADING可以自动删除相关的宠物行。

答案 3 :(得分:1)

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

我们假设以下

  • 索引查找是二进制搜索
  • dudes有1000行
  • 宠物有1000行

没有dude_id作为主键的表将产生1,000,000个关键比较,即笛卡尔积。那是O(n ^ 2)运行时间。

将dude_id作为主键的表将产生10,000(1000 x 10(1000的基数2)键比较。这是O(n log n)运行时间。

除非owner_id中的dude_id值分布不佳(例如dude_id拥有50多只宠物),否则第二种布局应该总是落空。