从MySQL到TiDB
以MySQL为代表的传统关系型数据库,虽然广泛应用,但是存在一些自身容量的限制。根据使用MySQL的经验,MySQL单表在2000万行以内时,性能较好;单表超过2000万行以后,数据库性能、可维护性都会急剧下降。
当然这时候可以使用分库分表,将大表拆分为小表,小表到的数据量控制在2000万行以内。通过水平扩展的方式,将不同的表存放于多台服务器,可以提升整个数据库集群的QPS
但是分库分表的缺点也很明显:
- 一张表(大表拆为多个子表,但是所有子表仍从属于这个大表)的数据在多台服务器上存在时,就需要进行分布式事务的控制
- 分表后,对于SQL语句(如join)有一定性能影响
- 分表后,需要维护的对象增长了(MySQL实例数、对原有SQL的改造)
此时,可以使用一些NoSQL数据库(如Redis、MongoDB)来“曲线救国”,但是NoSQL不支持SQL语句,并且一定程度上也不能提供MySQL的ACID特性,这就需要考虑有没有其他的数据库能支持海量数据下的分布式数据库服务了
NewSQL数据库因为以下特点,能够满足上述要求:
- 无限水平扩展能力
- 分布式强一致性,保证数据100%安全
- 完整的分布式事务处理能力和ACID特性
而TiDB是NewSQL数据库中的典型代表
关系型数据库、NoSQL、NewSQL
关系型数据库,RDBMS,常见如下:
- 商业软件:Oracle
- 开源软件:MySQL
NoSQL = Not only SQL,意为“不仅仅是SQL”,提倡牺牲复杂SQL语句和ACID特性来换取弹性扩展能力,因此不能保证强一致性。常见的NoSQL数据库如下:
- 键值(key-value)数据库:Redis
- 文档存储:MongoDB
- 列存储:存储结构化和半结构化数据,对数据进行压缩,对某几列的查询有非常大的IO优势,如Cassandra
NewSQL能够解决NoSQL不能完全取代RDBMS的问题,NewSQL可以提供与NoSQL相同的可扩展性和性能,同时支持事务的ACID特性,也支持SQL语句,代表产品如下:
- TiDB
- Google Spanner
- OceanBase
OLTP & OLAP
OLTP(在线事务处理, On-Line Transaction Processing),强调短时间内大量并发的事务操作(增删改查),强调事务的强一致性
OLAP(在线分析处理, On-Line Analysis Processing),偏向复杂的只读查询,读取海量数据进行分析计算。比如运营人员读取所有历史订单分析客户行为。
根据本人的从业经验,MySQl也是能够实现OLTP的,只不过上面提到MySQL在单表数据量超过千万行时性能会变差。如果要通过实时访问线上MySQL实例来执行OLAP的相关任务(比如运营人员每天做各种报表给领导看),这种操作往往会对线上MySQL实例带来压力,即使我们用了读写分离。因此,数据分析往往使用离线数据,在笔者前司,公司内部专门有个离线数据团队负责维护各业务团队产出的离线数据。
TiDB是同时支持OLTP和OLAP的