我正在使用MySQL工作台为我的第一个关系数据库编写一些简单的查询。我将这个特定的查询保存为一个存储过程。在这样做的过程中,我发现了一个意外的结果,即连接语句的数量和查询的持续时间/获取时间。
最初,我(意外地)联接了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;1)第一次查询时长/抓取时间
0.0011秒/ 0.000011秒
2)第二次查询时长/抓取时间
0.00068秒/ 0.000010秒
为什么会这样?
我真的很想理解这一点,因为我打算培训成一个DBA角色(最终笑)
PS-1:我使用的是每个表只有5条记录的微型数据集
PS-2:target_device_id是该查询所属存储过程的一个INT参数。
谢谢。
发布于 2019-07-26 09:31:01
我使用的是每个表只有5条记录的微型数据集
如果您想成为一名DBA,那么首先需要了解的一件事就是数据的大小如何影响查询计划和查询执行。你不能从一个小的数据集推广到一个大的数据集。
更重要的是,通常情况下,连接越多,查询速度越快。主要原因是过滤。查询的持续时间取决于处理步骤的数量和正在处理的数据量。
例如,您总是可以向查询中添加类似以下内容:
from a join
b
on . . . join
c
on . . . join
d
on 1 = 0最终的join条件过滤掉所有行,因此结果集为空。这可能比没有该条件的查询快得多。
https://stackoverflow.com/questions/57211427
复制相似问题