db - sql执行逻辑
SQL 的执行逻辑
SQL 查询的执行顺序通常如下:
- FROM 和 JOIN:确定需要操作的表以及它们之间的连接条件,生成临时的结果集。
- WHERE:过滤数据,应用筛选条件。
- GROUP BY 和 HAVING:对数据进行分组和筛选分组后的数据。
- SELECT:选择需要的列。
- ORDER BY:对结果进行排序。
- 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;