Skip to content

db - sql执行逻辑

SQL 的执行逻辑

SQL 查询的执行顺序通常如下:

  1. FROMJOIN:确定需要操作的表以及它们之间的连接条件,生成临时的结果集。
  2. WHERE:过滤数据,应用筛选条件。
  3. GROUP BYHAVING:对数据进行分组和筛选分组后的数据。
  4. SELECT:选择需要的列。
  5. ORDER BY:对结果进行排序。
  6. LIMIT/OFFSET(分页):在排序后的结果上应用分页。

因此,在分页查询时:

  • LEFT JOIN 会在主表和关联表之间生成一个完整的结果集。
  • 然后在这个结果集上应用分页逻辑。

场景

1.如果主表有10w的数据,left join 只是用来显示一个关联字段,分页取10条数据。是用join还是子查询

直接 LEFT JOIN 后分页

sql
SELECT u.id, u.name, o.some_field
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
WHERE o.some_field = 'some_condition'  -- 假设有筛选条件
LIMIT 10 OFFSET 0;
  • 如果主表和关联表数据量都很大,JOIN 操作会处理大量数据,生成一个庞大的临时结果集,

子查询先分页,再 LEFT JOIN

sql
SELECT u.id, u.name, o.some_field
FROM (
    SELECT id, name
    FROM users
    LIMIT 10 OFFSET 0
) AS u
LEFT JOIN orders o ON u.id = o.user_id
WHERE o.some_field = 'some_condition';  -- 假设有筛选条件
  • 主表分页后,只处理 10 条数据,大幅减少 JOIN 的数据量,查询效率更高。
  • 临时结果集规模小,减少内存和计算开销。
sql
SELECT u.id, u.name, o.some_field
FROM (
    SELECT id, name
    FROM users
    LIMIT 10 OFFSET 0
) AS u
LEFT JOIN (
    SELECT user_id, some_field
    FROM orders
    WHERE some_field = 'some_condition'
    LIMIT 1 -- 每个主表行仅匹配 1 条数据
) AS o ON u.id = o.user_id;

上次更新时间:

最近更新