我读过一些文章说,像MySQL这样的RDBMS并不擅长扩展,但像MongoDB这样的NoSQL可以很好地分解. 我想知道RDBMS提供的哪个功能本身不能很好地分片.
大多数RDBMS系统保证所谓的ACID属性.大多数这些属性归结为一致性 ; 对数据的每次修改都会将数据库从一个一致状态转移到另一个一致状态.
例如,如果您在单个事务中更新多个记录,则只要事务尚未完成,数据库将确保其他查询不会修改所涉及的记录.因此,在事务期间,可以锁定多个表以进行修改.如果这些表分布在多个分片/服务器上,则需要更多时间来获取适当的锁,更新数据并释放锁.
该CAP定理指出,分布式(即可扩展)系统不能保证所有在同一时间如下特性:
一致性
可用性
分区容差
RDBMS系统保证一致性.分片使系统能够容忍分区.根据该定理,系统因此无法保证可用性.这就是为什么标准RDBMS无法很好地扩展的原因:它无法保证可用性.如果您无法访问它,数据库有什么用?
NoSQL数据库降低了一致性,有利于可用性.这就是他们在可扩展性方面更好的原因.
我不是说RDBMS系统根本无法扩展,它只是更难.本文概述了一些可能的分片方案,以及您可能遇到的问题.大多数方法牺牲了一致性,这是RDBMS系统最重要的特性之一,并且阻止了它的扩展.