使用关系的MYSQL性能与不分配关系

时间:2013-03-18 20:18:05

标签: mysqli

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

1 个答案:

答案 0 :(得分:2)

通过在“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';