首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >外键会减慢连接查询速度吗?

外键会减慢连接查询速度吗?
EN

Stack Overflow用户
提问于 2018-08-16 15:35:57
回答 1查看 711关注 0票数 0

我有两个数据库test & test2。两者都有相同的表(员工和工资),而且都有相同的记录。test2数据库使用外键,测试数据库不使用外键。

测试结构

代码语言:javascript
复制
test.employees
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| emp_id | int(11)     | NO   | PRI | NULL    |       |
| name   | varchar(30) | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+

test.salaries
+--------+---------+------+-----+---------+----------------+
| Field  | Type    | Null | Key | Default | Extra          |
+--------+---------+------+-----+---------+----------------+
| id     | int(11) | NO   | PRI | NULL    | auto_increment |
| salary | int(11) | YES  |     | NULL    |                |
| emp_id | int(11) | NO   |     | NULL    |                |
+--------+---------+------+-----+---------+----------------+

test2结构

代码语言:javascript
复制
test2.employees
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| emp_id | int(11)     | NO   | PRI | NULL    |       |
| name   | varchar(30) | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+

test2.salaries
+--------+---------+------+-----+---------+----------------+
| Field  | Type    | Null | Key | Default | Extra          |
+--------+---------+------+-----+---------+----------------+
| id     | int(11) | NO   | PRI | NULL    | auto_increment |
| salary | int(11) | YES  |     | NULL    |                |
| emp_id | int(11) | NO   | MUL | NULL    |                |
+--------+---------+------+-----+---------+----------------+

我在两个数据库上运行相同的联接查询。

代码语言:javascript
复制
select * from employees inner join salaries on employees.emp_id=salaries.emp_id;

这是我从不包含外键的测试数据库中获得的输出

代码语言:javascript
复制
2844047 rows in set (3.25 sec)

这是我从包含外键的test2数据库获得的输出。

代码语言:javascript
复制
2844047 rows in set (17.21 sec)

那么外键会减慢连接查询的速度吗?

EN

回答 1

Stack Overflow用户

发布于 2018-08-16 15:41:06

你的经验证据表明,至少在一个案例中是这样的。所以,如果我们相信你的数字,答案很明显是“是的”--我想你已经排除了其他可能的原因,比如桌子上的锁或者资源竞争(实际上差别很大)。我猜你想知道为什么。

在大多数数据库中,声明外键与关系完整性有关。它不会对查询的优化产生任何影响。查询中的join条件将冗余地覆盖相同的信息。

但是,当声明外键时,MySQL会做得更多。外键声明会自动为所使用的列创建索引。这不是标准行为--我甚至不确定是否有其他数据库这样做。

通常情况下,索引将有利于性能。在这种情况下,优化器对于如何处理查询有更多的选择。无论出于什么原因,它都在使用不符合标准的执行计划。

您应该能够查看explain计划并看到不同之处。问题是优化器选择了错误的计划。我要说,这是不常见的,不应劝阻您在数据库中使用正确的外键声明。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51880727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档