mysql - JOIN 语句的数量如何影响查询的持续时间/获取时间?我有一个简单的、反直觉的例子
问题描述
我使用 MySQL Workbench 为我的第一个 RDB 编写了一些简单的查询。我将此特定查询保存为存储过程。在这样做的过程中,我发现了一个关于 JOIN 语句数和查询的持续时间/获取时间的意外结果。
最初,我(不小心)加入了 2 个表而不是 3 个(一个customers
表、一个devices
表和一个映射表client_devices
)。当我测试它时,我记录了持续时间和获取时间。当我意识到我的错误时,重新编写了查询以包含另一个 JOIN 语句,并记录了持续时间,我惊讶地发现尽管更细微,但它花了一半的时间......我很好奇这是为什么。
-- 1) This is the first "flawed" query
SELECT
first_name,
last_name,
email,
phone
FROM customers c
JOIN client_devices cd
USING (customer_id)
WHERE cd.device_id = target_device_id;
-- 2) This is the second, "correct" query
SELECT
d.device_name,
first_name,
last_name,
email,
phone
FROM customers c
JOIN client_devices cd
USING (customer_id)
JOIN devices d
USING (device_id)
WHERE cd.device_id = target_device_id;
如果在运行这些查询之前有人问我,我会假设具有 2 个 JOIN 的较长查询肯定会比只有 1 个的较短查询花费更长的时间。但实际上,结果恰恰相反。
1)第一次查询持续时间/获取时间
0.0011 秒 / 0.000011 秒
2)第二次查询持续时间/获取时间
0.00068 秒 / 0.000010 秒
为什么会这样???
我真的很想了解这一点,因为我打算训练成为 DBA 角色(最终大声笑)
PS-1:我正在使用每个表只有 5 条记录的微数据集
PS-2:target_device_id
是该查询所属的存储过程的 INT 参数。
谢谢你。
解决方案
我正在使用每个表只有 5 条记录的微数据集
如果您想成为一名 DBA,您需要学习的第一件事就是数据大小如何影响查询计划和查询执行。您无法从小数据集泛化到大数据集。
更重要的是,通常情况下,更多的连接会导致更快的查询。主要原因是由于过滤。查询的持续时间取决于处理步骤的数量和正在处理的数据量。
例如,您总是可以在查询中添加类似这样的内容:
from a join
b
on . . . join
c
on . . . join
d
on 1 = 0
最终join
条件过滤掉所有行,因此结果集为空。这可能比没有该条件的查询要快得多。
推荐阅读
- meshlab - 在比较两个网格进行矢量分析时如何分析特定区域
- javascript - 为什么 keydown 上的修饰键在“输入”中延迟?
- c - 使用 C 测量内存写入带宽
- javascript - 模态在 Dev 中打开,但在 Heroku 上没有
- nix - 如何在 configuration.nix 中引用用户的主目录?
- reactjs - 我已经被踩了几天了,为什么没有返回任何东西?
- javascript - 调整 Flot Graph 窗口大小但防止元素拉伸
- java - 如何以毫秒为单位显示构建时间?(JAVA)
- docker - docker-compose 文件构建上下文解释
- ip - 如何获得多个公网IP?