首页 > 解决方案 > 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 参数。

谢谢你。

标签: mysqlsql

解决方案


我正在使用每个表只有 5 条记录的微数据集

如果您想成为一名 DBA,您需要学习的第一件事就是数据大小如何影响查询计划和查询执行。您无法从小数据集泛化到大数据集。

更重要的是,通常情况下,更多的连接会导致更快的查询。主要原因是由于过滤。查询的持续时间取决于处理步骤的数量和正在处理的数据量。

例如,您总是可以在查询中添加类似这样的内容:

from a join
     b
     on . . .  join
     c
     on . . . join
     d
     on 1 = 0

最终join条件过滤掉所有行,因此结果集为空。这可能比没有该条件的查询要快得多。


推荐阅读