下面这段,主要是对 What's Really New with NewSQL[1] 中 A Brief History of DBMSs 这一章的摘录。
2000 年以前,数据库更关心一致性和正确性。比如一些金融系统,正确性远远比性能要重要。
到 2000 的时候,互联网开始高速发展。带来了两个问题,一个是大量的在线用户,以及希望应用可以时刻在线。
人们开始发现,单机的数据库无法满足这样的需求,而且靠着升级硬件也不太划得来(affordable)。
这个时候就开始使用分库、分表的方式扛流量。通过这样的手段把流量分散到不同的数据库实例上。
之后大家又发现,同准确性和一致性比起来,在互联的场景下,更重要的是可用性和性能。
而且大家觉得 MySQL 这种关系型数据库太麻烦了,写应用也不那么顺手。
于是在 00 年代中晚期(mid to late late 2000s),大家搞起了 NoSQL。
首先 NoSQL 为了性能,牺牲了一致性。并且使用了不同的数据模型,比如 Key/Value,图,文件。
相应的数据库有 Google 的 Big Table,Amazon 的 Dynamo,Facebook 的 Cassandra,以及 MoongoDB。
到了 00 年代晚期的时候,大家又觉得有些应用事务和强一致性是必要的,如果让开发者去处理不一致,会耗费过多的经历。并且这个时候硬件也比之前有了很大的改善。
人们希望数据库可以像 NoSQL 一样可以很好的扩展,并且保证 ACID,于是又搞起了 NewSQL。比如 Google 的 Spanner,PingCAP 的 TiDB。
下面说点个人的想法,不见得对,说错了的话还望大家指正。
分库、分表以及 NoSQL 之所以兴起,有两个前提,一个是大流量和全天在线的需要,一个是当时的单机硬件不足以支撑这样的场景。
并且,多数的时候我们认为,MySQL 这种关系型数据库,由于使用树来存储,当数据量大到一定程度的时候,需要多次访问磁盘,所以性能上不去。
但实际上这些假设不一定都成立。
首先说数据库和磁盘的关系,现在有了 SSD,访问磁盘的速度已经比以前快太多了。
如果优化的好的话,访问数据库的瓶颈不在磁盘而是在内存 [2]。
因为数据库有 memory buffer,如果数据 locality 很好的话,几乎都是在访问内存。
再加上,现在的硬件越来越便宜,我们大可把内存加的大一点,让数据尽可能命中 memory buffer。
而且很多流量也没到单机 MySQL 的上限。
不过问题是,MySQL 确实远比 Key/Value Storage 麻烦。
[1] A. Pavlo, et al., What's New with NewSQL?, in SIGMOD Record (vol. 45, iss. 2), 2016
[2] Joseph Hellerstein and Michael Stonebraker. "Architecture of a Database System"