说明
首先MySQL提供了众多的存储引擎供用户使用,但是支持事务的存储引擎并不多:NDB和InnoDB两个。但是NDB只支持在NDB集群中使用,并不支持在其他场景下使用。下面我们主要讨论它们之间不同的地方,各自的优缺点方便用户根据自己的实际情况进行选项。
注:在NDB集群中,只支持NDB存储引擎的表,其他存储引擎的表将不会被集群化。
NDB和InnoDB的不同点
NDB需要通过一个分布式集群来使用,采用的不共享任何数据、组件的集群,无单点故障。
- 以MySQL8.0,NDB8.0版本为例:
而对于MySQL5.7,NDB7.5/7.6版本没有区别,除了数据库版本之外。
特性 |
InnoDB (MySQL 8.0) |
NDB 8.0 |
MySQL版本 |
8.0 |
8.0 |
InnoDB版本 |
8.0.15 |
8.0.15 |
NDB集群版本 |
N/A |
8.0.14/8.0.14 |
存储限制 |
64TB |
128TB |
外键 |
Yes |
Yes |
事务 |
所有类型 |
READ COMMITTED |
MVCC |
Yes |
No |
数据压缩 |
Yes |
No (NDB的检查点和备份文件可以压缩) |
大行数据(> 14K) |
支持 VARBINARY,VARCHAR,BLOB,TEXT |
只支持 BLOB,TEXT (如果存储非常大的数据,会降低NDB的性能) |
支持复制 |
异步和半同步复制; MySQL组复制 |
在NDB集群中自动同步复制;在NDB集群之间使用MySQL复制进行异步复制(不支持半同步复制) |
分布式读 |
Yes (MySQL复制) |
Yes |
分布式写 |
需要应用程序级别进行操作 |
Yes |
高可用 |
内置,InnoDB集群 |
Yes (99.999%的稳定性) |
节点故障恢复、切换 |
MySQL组复制 |
自动化 |
节点故障恢复时间 |
30秒或更长 |
通常情况小于1秒 |
实时性能 |
No |
Yes |
内存表 |
No |
Yes (可以同时存储在磁盘、内存上) |
NoSQL访问存储引擎 |
Yes |
Yes (多种APIs, 包括:Memcached, Node.js/JavaScript, Java, JPA, C++和HTTP/REST) |
并发和并行写入 |
Yes |
可支持最多48并行写操作, 优化并发写入操作 |
冲突检测和解决(多主) |
Yes (MySQL Group Replication) |
Yes |
Hash索引 |
No |
Yes |
在线添加节点 |
组复制中的读、写节点 |
Yes (所有类型的节点) |
在线升级 |
Yes (复制) |
Yes |
在线修改 |
Yes |
Yes |
NDB和InnoDB的性能、负载比较
NDB集群具有一系列独特的属性,这些属性使其非常适合为需要高可用性、快速故障转移、高吞吐量和低延迟的应用程序提供服务。由于其分布式体系结构和多节点实现,NDB集群还具有特定的约束,可能会阻碍一些工作负载的良好执行。关于数据库驱动的应用程序工作负载的一些常见类型,NDB和InnoDB存储引擎在行为上的一些主要差异如下表所示:
负载 |
InnoDB |
NDB 集群 |
大容量OLTP应用程序 |
Yes |
Yes |
DSS应用(数据marts,分析) |
Yes |
Limited (Join operations across OLTP datasets not exceeding 3TB in size) |
自定义应用程序 |
Yes |
Yes |
打包的应用程序 |
Yes |
Limited (通过主键访问); NDB 8.0集群支持外键 |
网络电讯应用(HLR, HSS, SDP) |
No |
Yes |
会话管理和缓存 |
Yes |
Yes |
电子商务应用程序 |
Yes |
Yes |
用户档案管理,AAA协议 |
Yes |
Yes |
NDB和InnoDB特性总结
使用InnoDB主要关心的需求
- 外键
注: NDB 集群 8.0支持外键
- 全表扫描
- 非常大的数据、行或事物
READ COMMITTED 以外的事务类型
使用NDB主要关心的需求
- NDB 集群8.0支持外键
- 写分离
- 99.999%的运行可靠性
- 在线添加节点、在线修改
- 多个SQL 和NoSQL API
- 实时性能
BLOB 列限制使用
- 支持外键
|