Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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性能_Mysql - Fatal编程技术网

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

使用关系与不分配关系的MYSQL性能,mysql,Mysql,我有一个相当大的数据库,100多个表。数据库的设计是传统的关系数据库。我在与外键关联的表中有主键。但是,我没有在实际的mysql dba中建立任何关系。我使用PHP访问一个网站的数据,所有查询都将通过join语句连接表,该语句的ON设置为主键=外键。关于这种关系的知识其实都在我的脑海中,事实上我使用了一个非常简单的命名约定。所有主键都是末尾带有PK的tablename,即tablenamePK,所有外键都是末尾带有ID的tablenamde,即tablenameID。在为PHP运行创建SQL时,

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

外键不会为性能带来任何好处,而在“FK”列上创建普通索引是无法做到的。也就是说,您不必为了性能而需要约束

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


请回复您的评论:

右侧,为给定主键、唯一键或外键约束的列隐式创建索引

索引是否会带来好处和表无关,甚至和它们是否有引用其他表的列无关。这与您运行的查询有关

例如:

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';

比尔,我所有的桌子都是InnoDB的。我没有手动创建索引,但是当我查看这些表时,我看到已经为我的PK建立了索引,我假设,因为它们设置为自动增加,MySQL做出了这个假设并创建了索引。但是,我的外键都没有索引。通过手动为外键创建索引,我会看到性能提升吗?对不起,比尔已经忙了几天了。显然,我不是靠管理数据库为生的,这更像是一个附带项目。谢谢你的回答和例子。因此,在某些情况下,根据对外键进行索引的查询可能会有所帮助,但在其他查询中没有帮助。也就是说,索引外键有缺点吗?我的习惯是索引所有外键列。我很可能需要运行一个查询,该查询将从该索引中受益,如果有一些这样的索引从未被查询使用,那么这是一个可接受的开销。如果我预计一个表将增长到数亿行,那么我会更仔细地计划。