简单查询:
select *
from data.staff AS staff
left join data.contact AS workphones on staff.id = workphones.staff_with_work_phone_id
Mysql 运行时间:5.3 秒
玛丽亚德布 运行时间: 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 | |
+----+-------------+------------+------+--------------------------------+--------------------------------+---------+--------------------+-------+----------+-------+
其余验证条件相同。测试进行了多次。
你的两个查询计划告诉你为什么MySQL更慢。两者都找到可能的键,这是一个外键。
MariaDB 将使用 FK:FK_1249f6bc1d68495090691f3ce02 在第 2 行的两列possible_keys
和keys
MySQL确实看到了FK,但不使用它。MySQL告诉你,它将使用一个
使用连接缓冲区(块嵌套循环(
在EXTRA
表中。
MySQL 不使用您的外键。
外键连接在两个数据库系统中,您的外键是否有索引?如果只有MariaDB拥有它,那么你就不能责怪MySQL,因为它不能使用它没有的东西。