跨分片查询:棘手的问题
了解跨分片连接和事务为何是分布式数据库中最棘手的问题,以及减少这类操作的常用模式
跨分片查询:棘手的问题 是 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 反馈 — 无需本地设置。
此课程中的所有课时
- 分片策略:范围、哈希与目录
- 跨分片查询:棘手的问题
- Citus 与分布式 Postgres
- 何时不应分片