2017-04-07 90 views
0

简单的查询:简单的查询:mysql的 - 很慢,MariaDB的 - 良好的性能

select * 
from data.staff AS staff 
left join data.contact AS workphones on staff.id = workphones.staff_with_work_phone_id 

Mysql的运行时间:5.3秒。
MariaDb运行时间:0.016秒。

联系人有〜50000行。
工作人员有〜600行。

是什么原因?
是否有可能在mysql上实现相同的结果?

谢谢!

解释的MySQL(v5.7.14):

+----+-------------+------------+------------+------+--------------------------------+------+---------+------+-------+----------+---------------------------------------+ 
| id | select_type | table  | partitions | type | possible_keys     | key | key_len | ref | rows | filtered | Extra         | 
+----+-------------+------------+------------+------+--------------------------------+------+---------+------+-------+----------+---------------------------------------+ 
| 1 | SIMPLE  | staff  | NULL  | ALL | NULL       | NULL | NULL | NULL | 606 | 100.00 | NULL         | 
+----+-------------+------------+------------+------+--------------------------------+------+---------+------+-------+----------+---------------------------------------+ 
| 2 | SIMPLE  | workphones | NULL  | ALL | FK_2f7824065c2c4b0fbe5c00da271 | NULL | NULL | NULL | 49180 | 100.00 | Using where.       | 
| |    |   |   |  |        |  |   |  |  |   | Using join buffer (Block Nested Loop) | 
+----+-------------+------------+------------+------+--------------------------------+------+---------+------+-------+----------+---------------------------------------+ 

解释MariaDB的(v10.0.28):

+----+-------------+------------+------+--------------------------------+--------------------------------+---------+--------------------+-------+----------+-------+ 
| id | select_type | table  | type | possible_keys     | key       | key_len | ref    | rows | filtered | Extra | 
+----+-------------+------------+------+--------------------------------+--------------------------------+---------+--------------------+-------+----------+-------+ 
| 1 | SIMPLE  | staff  | ALL |        |        |   |     | 602 | 100.00 |  | 
+----+-------------+------------+------+--------------------------------+--------------------------------+---------+--------------------+-------+----------+-------+ 
| 2 | SIMPLE  | workphones | ALL | FK_1249f6bc1d68495090691f3ce02 | FK_1249f6bc1d68495090691f3ce02 | 9  | user_data.staff.id | 25476 | 100.00 |  | 
+----+-------------+------------+------+--------------------------------+--------------------------------+---------+--------------------+-------+----------+-------+ 

的验证条件,其余是相同的。 测试进行了很多次。

+1

这些数据库的哪些版本?他们都适当调整?相同的硬件?您是否多次运行测试以确保缓存被预热?服务器是否都闲置? – tadman

+0

显示**服务器 –

+0

查询中的** EXPLAIN **我添加了需要的信息。 – Vladimir

回答

1

您的两个查询计划显示了为什么MySQL更慢。 两者都找到可能的密钥,这是一个外键。

MariaDB的将使用FK:FK_1249f6bc1d68495090691f3ce02两列中possible_keyskeys行2

MySQL的没有看到FK,但不使用它。 MySQL的告诉你,它会在EXTRA表中使用

使用加入缓冲液(块嵌套循环)

MySQL不使用您的外键。

外键加入 在两个数据库系统中,您的外键都有索引吗? 如果只有MariaDB有它,那么你不能责怪MySQL,因为它不能使用,它没有。