用Postgres替换MySQL
互联网公司中MySQL毫无疑问是当下最流行的开源免费数据库。但它却不是一个理想的选择
以下一些显著的问题无法解决,导致你常常需要“优化”Schema和SQL。
- DDL在5.6版本以前会锁表禁止写入。5.6版本允许写入但耗时太长。
- DDL不支持事务,含有DDL的自动化升级动脚出问题时,需要“手动或写额外脚本”回滚。
- 不支持WITH语法,SQL难以结构化,复杂SQL难以维护。
- 索引类型单一,索引利用率低,不支持条件索引和定制索引。
- 执行计划提供的信息有限,不利于性能分析。
- SQL优化不好,尤其是子查询。
- 分析函数有限,不支持Window Function。
- 不支持RETURNING和递归查询
- ……
当然这些问题可以解决,但需要花费多余时间去“优化”你的SQL。
除了增加不必要的工作外,还会走很多弯路,活生生的愚公移山!
阿里,腾讯虽然还在用MySQL。但是他们仍然有这类问题.
- 阿里通过分表(注意不是分库)减少表尺寸,可以降低DDL耗时,提升写入效率。但是这需要大量额外维护工作和额外维护脚本。
- 前腾讯T4的人告诉我说腾讯已经解决了这些问题。后来我前同事就职于他公司,说一次线上升级,因为DDL锁表导致部分应用超时瘫痪,只好取消升级,想其他办法解决。:)
- 如果不修改InnoDB物理存储设计,DDL的耗时问题从理论上就不能解决,若解决了那他就不是InnoDB(相当于重新开发数据库)。
为突破磁盘容量瓶颈,需要做分库。通常会规范禁止使用一些基本特性(如:JOIN)和上术提到的功能。但大表DDL的问题是跑不掉的,所以需要分表控制表尺寸解决这问题。对于大部分公司是没有精力和资源的,所以大多数公司数据库大表DDL升级时会。选择夜晚升级,相关应用停机一小会。
MySQL中数据量大于3000w的表就能明显感觉到DDL操作耗时和锁表。如果要求升级过程不允许停机,那就需要用分表来控制表尺寸。
因为解决上术问题需要长期持续投入额外精力和时间,所以我推荐PostgreSQL替换MySQL。
PostgreSQL是一款面向对象的关系型数据库。
除了没有上面提到的MySQL的问题,还很先进。
支持JSON数据类型的查询和索引,类似MongoDB。
由于物理数据是分散存储。DDL不锁表、不耗时并且支持事务回滚
最早源于Berkeley由迈克尔·斯通布雷克(Michael Stonebraker)主导开发。
Michael Stonebraker是2014年图灵奖得主,主要贡献为现代数据库概念与实践。
图灵在数据库领域总共有4位得主,分别是:
- 1973 查理士·巴克曼(Charles W. Bachman) 最初数据库概念技术
- 1981 埃德加·科德(Edgar F. Codd) 尊定关系模型
- 1998 詹姆斯·格雷(Jim Gray) 事务处理及实现
- 2014 迈克尔·斯通布雷克(Michael Stonebraker) 现代数据库高级特性
图灵奖很少颁发给数据库领域,Postgres领导人则是其中一位。即使是开阔视野,也是值得学习的,他文档做的非常全面PostgreSQL。
这有两篇Instagram关于Postgre的分享:
- 分布式ID生成方案选择与实现:sharding-ids-at-instagram
- 基于Postgre特性的性能优化:handling-growth-with-postgres-5-tips-from