4

我有一个相当大的数据库,100 多个表。数据库的设计是传统的关系数据库。我在与外键关联的表中有主键。但是,我在实际的 mysql dba 中并没有建立任何关系。我使用 PHP 访问网站的数据,所有查询都将通过将 ON 设置为主键 = 外键的连接语句连接表。关系的知识真的都在我的脑海里,而且我使用了一个非常简单的命名约定。所有的主键都是以PK结尾的tablename,即tablenamePK,所有的外键都是tablenamde,以id结尾,即tablenameID。在创建 SQL 以供 PHP 运行时,很容易看到什么是主键,什么是外键。也就是说,我 我一直在争论我是否应该在我的 MySQL DBA 中真正创建这些关系。这样做会提高性能吗?直到最近,性能才成为一个大问题,现在我希望在考虑升级硬件之前尽可能提高效率。

4

1 回答 1

3

外键不会获得任何通过在“FK”列上创建普通索引无法实现的性能。也就是说,为了性能,您不一定需要约束。

外键约束旨在防止数据异常。


回复您的评论:

对,索引是为给定 PRIMARY KEY、UNIQUE KEY 或 FOREIGN KEY 约束的列隐式创建的。

索引是否会带来好处与表无关,或者即使它们具有引用其他表的列。它与您运行的查询有关。

例如:

CREATE TABLE Departments (ID INT PRIMARY KEY, name VARCHAR(10));

CREATE TABLE Employees (ID INT PRIMARY KEY, name VARCHAR(10), DeptID INT NOT NULL);

显然这些表是相关的,但我们没有定义索引或外键约束。

Employees.DeptID 上的索引将有助于此查询返回培训部门的所有成员。该查询首先按名称查找部门,然后使用它使用索引查找相应的员工。

SELECT ... FROM Departments d JOIN Employees e ON d.ID = e.DeptID  
WHERE d.name = 'training';

但是该索引对于返回特定员工的部门名称的查询没有任何作用。该查询首先按名称查找员工,然后使用它通过主键 id 查找相应的部门。

SELECT ... FROM Departments d JOIN Employees e ON d.ID = e.DeptID  
WHERE e.name = 'Bill';
于 2013-03-18T20:22:54.690 回答