MySQL的对手有哪些
MySQL是当前主流的关系型数据库,他易上手、性能ok且功能强大,但是他也有自己短手的地方,比如说大规模数据存储、分布式较差等各种问题。除了MySQL之外,其他的数据库都有所耳闻,本文收集了其他的主流数据库。
行存储和列存储
![](https://img.haomeiwen.com/i1089449/854194755a6df4f1.png)
同样一张数据表,上图下方表示了两种模型的存储方式的不同:
- 行存储模型
数据是以行为单位存储的,一条完整的数据为一块,这样的好处是插入的时候直接在后面添加就行,修改的时候也方便,只要找到了查询条件字段的位置,那么这条记录的位置也找到了,不用去其他地方去找另外的字段。
不好的地方就是查询起来偏慢,因为他要整行整行的遍历,特别是查询条件多的时候,有可能某一行数据要遍历多次。 - 列存储模型
数据是以列为单位存储的,插入的时候需要找到每一列的末尾位置来添加数据,修改也是需要到每一列找到这一条记录的对应字段位置,所以写数据效率不如行存储效率高。
好的地方就是查询效率高,具体查询效率图见下图。
![](https://img.haomeiwen.com/i1089449/8fe093b9585f6585.png)
关键步骤如下:
- 去字典表里找到字符串对应数字(只进行一次字符串比较)。
- 用数字去列表里匹配,匹配上的位置设为1。
- 把不同列的匹配结果进行位运算得到符合所有条件的记录下标。
- 使用这个下标组装出最终的结果集。
除了查询效率之外,我们还能看到,列存储方式采用了数据字典的方式对数据进行了压缩,这也是为什么列存储除了查询效率高之外,还有数据压缩比大的原因之一。
以上内容摘自:几张图看懂列式存储
MySQL
![](https://img.haomeiwen.com/i1089449/095729472feaf013.png)
mysql是很经典的一款数据库,他具备以下特性:
- 行存储模型,保证数据完整性
- 支持事务,保证写操作的原子性和一致性
- 支持表分区,能一定程度上优化读取性能
- 支持存储过程、触发器、定时器等各种实用的功能
要说mysql的好处就要跟其他的对比来看,不然光说一个体现不出好来,下面拿几个数据库来做一下对比,顺便了解一下数据库的生态。
MariaDB
![](https://img.haomeiwen.com/i1089449/e3da601359117cc0.png)
这个是跟MySQL最像的,有MySQL的创始人开发且维护的一条MySQL的开源分支,创建的原因是担心Oracle收购之后会有闭源的风险,所以就因此而诞生。
他跟MySQL基本上是一模一样,完全兼容MySQL。10.x版本发布之后,使用XtraDB代替了InnoDB,并且他支持非阻塞操作和进度报告(InnoDB写数据的时候是阻塞行的),先后有一些开源项目——比如Fedora,维基媒体基金会等使用MariaDB替代了MySQL。
InfoBright
![](https://img.haomeiwen.com/i1089449/13cbe6b9b44043ea.png)
InfoBright是一个基于MySQL的数据仓库存储方案。跟MySQL相比,他有以下特点:
- 优点
- 大数据量查询性能强劲、稳定:查询性能高,如百万、千万、亿级记录数条件下,同等的SELECT查询语句,速度比MyISAM、InnoDB等普通的MySQL存储引擎快5~60倍。
高效查询主要依赖特殊设计的存储结构对查询的优化,但这里优化的效果还取决于数据库结构和查询语句的设计。 - 存储数据量大:TB级数据大小,几十亿条记录。数据量存储主要依赖自己提供的高速数据加载工具(百G/小时)和高数据压缩比(>10:1)
- 高数据压缩比:号称平均能够达到 10:1 以上的数据压缩率。甚至可以达到40:1,极大地节省了数据存储空间。高数据压缩比主要依赖列式存储和 patent-pending 的灵活压缩算法。
- 基于列存储:无需建索引,无需分区。即使数据量十分巨大,查询速度也很快。用于数据仓库,处理海量数据没一套可不行。不需要建索引,就避免了维护索引及索引随着数据膨胀的问题。把每列数据分块压缩存放,每块有知识网格节点记录块内的统计信息,代替索引,加速搜 索。
- 快速响应复杂的聚合类查询:适合复杂的分析性SQL查询,如SUM, COUNT, AVG, GROUP BY
- 大数据量查询性能强劲、稳定:查询性能高,如百万、千万、亿级记录数条件下,同等的SELECT查询语句,速度比MyISAM、InnoDB等普通的MySQL存储引擎快5~60倍。
- 缺点
- 不支持数据更新:社区版Infobright只能使用“LOAD DATA INFILE”的方式导入数据,不支持INSERT、UPDATE、DELETE。
- 不支持高并发:只能支持10多个并发查询
- 没有提供主从备份和横向扩展的功能。
分析看来,优点和缺点都符合数据仓库的特性,容量大,查询效率高,但是并发性能低,写数据不方便,第三点是让我有点意外的,不支持横向扩展,这样使用起来到后面会有很大的问题。
PostgreSQL
![](https://img.haomeiwen.com/i1089449/c627c027c30cc344.png)
PostgreSQL是一款列式存储的数据库,他跟MySQL最大的区别还是不是在存储方式上,而是他是一款面向对象的存储方案,他功能强大,支持全文搜索,支持json数据索引,支持restAPI,这也是他最大的特点。
同MySQL相比,他的特点在于他是一款列式存储方案,所以写性能比MySQL要差一些,但是读性能和数据压缩效率比MySQL高,MySQL那些数据存储的诟病——比如说emoji、text等都需要另外配置才能实现的特点,在postgreSQL这里都得以解决。
MongoDB
![](https://img.haomeiwen.com/i1089449/932d7d1bd8c733c5.png)
一款基于文件存储的NoSQL数据库。
NoSQL指的是Not Only SQL,费关系型数据库,mongoDB作为一款最流行的NoSQL数据库,具有以下特点:
- 没有声明性查询语言
你不知道你查询的数据是什么数据格式的,是int还是string…… - 没有预定义的模式
键值对存储,列存储,文档存储,图形数据库 - 最终一致性,而非ACID属性
最终一致性是说,数据修改之后,并不是第一时间所有数据节点都同步到的,但是最终数据都是一致的。 - 非结构化和不可预知的数据
有表的概念(索引),但是没有表的严格限制,允许每条记录有不同的字段,查出来的数据也是不可知的。 - 高性能,高可用性和可伸缩性
分布式系统的普遍优点
简单来说,NoSQL最大的特点就是分布式,易拓展,查询效率高,且架构灵活,没有固定的数据结构。缺点在于支持的查询方式较少,一般用的最多的就是键值对查询,这点也是他应用的最多的地方。
比如说我有一个需求是要在一个庞大的数据集合中根据id查出对应的记录,这种场景就是NoSQL大展身手的地方。
Redis
![](https://img.haomeiwen.com/i1089449/0ca854d6efd7b3dc.png)
Redis是一款内存数据库,这是他跟上面那些数据库最大的不同,是他只支持key-value存储,并且他所有的数据都是放在内存里面的,一旦服务挂掉,如果没有备份,数据是恢复不了的。
相比于MySQL,他比NoSQL的更加“不合群”,可以理解为他跟MySQL是不存在什么可比性的,双方是互补的一种存在。我们经常用到的应用场景是redis作为缓存,提高mysql的查询速度,因为他读写速度快,而mysql则是真正存储数据的地方,因为他的数据是持久化的,并且支持各种查询方式。
以上就是我对目前主流数据库的一些拙见,有什么说的不恰当的地方欢迎大牛帮忙指出。