SQL Academy · 课时

跨分片查询:棘手的问题

了解跨分片连接和事务为何是分布式数据库中最棘手的问题,以及减少这类操作的常用模式

第 2 / 4 课13 个步骤

跨分片查询:棘手的问题 是 CoddyKit 上的免费 SQL Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 SQL Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 SQL Academy 课程共包含 4 节课。

分片的代价

分片可以扩展写入能力和容量,但会让跨分片的查询变得痛苦:每个跨分片 query 都会产生扇出。

单分片查询很简单

如果 WHERE 子句中包含分片键,路由器就会将一个 query 发送到一个分片:

-- shard_id = hash(user_id) % N
SELECT * FROM orders WHERE user_id = 42;
-- Router computes shard, sends one query, gets one result.

扇出查询

没有分片键时,路由器会查询每个分片,然后合并结果:

-- WHERE status = 'paid' — no user_id
SELECT * FROM orders WHERE status = 'paid' ORDER BY created_at DESC LIMIT 100;
-- Must query all N shards, merge results, sort, take top 100.

扇出聚合

对于 COUNT/SUM/AVG:从每个分片获取部分结果,然后在路由器或应用程序中合并:

-- On each shard:
SELECT COUNT(*), SUM(total) FROM orders;

-- Aggregator:
final_count = SUM(counts), final_sum = SUM(sums)

-- AVG is trickier — need SUM and COUNT, can't average averages.

跨分片 JOIN

如果两侧都使用相同的键进行分片(共置),JOIN 就会在分片本地执行。否则,在大规模场景下基本无法实现。

引用表(在各处复制)

小型“查找”表会复制到每个分片,因此与它们进行的 JOIN 可以保持在本地。Citus 称它们为“引用表”。

避免跨分片模式

架构设计技巧:

  • 反规范化——将父级数据复制到子级所在的分片中
  • 在所有地方使用分片键——即使看起来“不必要”
  • 在单独的分析数据库中预先计算报表

跨分片分页

在许多分片上执行 OFFSET 1000 LIMIT 10 非常糟糕——每个分片都必须生成 1010 行。请改用键集分页。

分布式事务

两阶段提交(2PC)负责协调跨分片的原子提交。在发生分区时速度慢且脆弱。实际应用中,应围绕 Saga 模式进行设计:

// Saga pattern (conceptual):
//   1. Local TX on shard A: mark as pending, log
//   2. RPC to shard B: do its part
//   3. Local TX on shard A: mark as committed
//   4. On failure: compensating transactions

热点分片

一个名人用户或一个爆款产品——集中在一个分片上的流量会让您的扩展方案失效。请检测并拆分(子分片),或将其迁移。

跨分片外键

RDBMS 的外键无法跨越分片。您可以在应用程序中强制执行引用完整性,或者接受跨分片关系的最终一致性。

总结

分片将难题从“扩展写入能力”转移成“调整查询形态,使其保持在分片本地”。

  • 单分片查询速度快
  • 扇出速度慢
  • 通过反规范化让工作保持在本地
  • 使用引用表保存共享维度
  • 使用 Saga,而不是 2PC

快速检查

在分片数据库中,不在 WHERE 中包含分片键的 SELECT 为什么成本高?

免费开始

用 AI 导师学习 SQL — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
46
课程
183

常见问题解答

「跨分片查询:棘手的问题」课时是免费的吗?

是的 — 「跨分片查询:棘手的问题」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 SQL Academy 课程的其余内容,请升级到 CoddyKit PRO。 SQL Academy 课程共包含 4 节课。

「跨分片查询:棘手的问题」这节课中我会学到什么?

了解跨分片连接和事务为何是分布式数据库中最棘手的问题,以及减少这类操作的常用模式 你通过在浏览器中直接运行的动手代码来练习 SQL Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 SQL Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 SQL Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「跨分片查询:棘手的问题」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 SQL Academy 课中编写并运行代码吗?

能。每节 SQL Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 分片策略:范围、哈希与目录
  2. 跨分片查询:棘手的问题
  3. Citus 与分布式 Postgres
  4. 何时不应分片
← 返回 SQL Academy