为什么只读副本数据库不像主数据库那么慢?他们不会因为必须同步而遭受同样的 "write burden" 吗?

Why aren't read replica databases just as slow as the main database? Do they not suffer the same "write burden" as they must be in sync?

我的理解:只读副本数据库的存在是为了允许读取量扩展。

到目前为止,一切都很好,有很多副本可供阅读 - 好的,这是有道理的,在一堆副本之间共享读取量。

但是,我正在阅读的内容似乎暗示着“tada!magic fast copys!”。副本如何更快,因为它们肯定也必须承受与主数据库相同的写入量才能保持同步?

How are the copies faster, as surely they must also be burdened by the same amount of writing as the main db in order that they remain in sync?

好问题。

首先,如果通过将 Write-Ahead 日志重播到辅助节点(有时称为“物理副本”)来维护副本,则写入副本可能比写入主副本更有效,而不是将查询重播到辅助节点(有时称为“逻辑副本”)。物理副本不需要执行任何查询处理来保持同步,并且可能不需要将目标数据库 blocks/pages 读入内存以应用更改,留下更多的内存和 CPU 可以自由处理读取请求。

即使是逻辑副本也可能能够以更便宜的方式在副本上应用更改作为对表单的主查询的查询

update t set status = 'a' where status = 'b'

可能会复制为一系列

update t set status = 'a' where id = ?

使副本不必识别要更新的行。

其次,辅助节点允许读取工作负载扩展到更多物理资源。因此总读取工作负载分布在更多服务器上。