初次接触MysqL,简单的和Postgresql做一个对比,主要是存储引擎这块。(个人认为虽然MysqL支持存储引擎的热插拔,并且存储引擎五花八 门,MysqL的说法是适应不同的应用场景,非常抱歉的是现在的应用都是比较综合型的,MysqL的大多数引擎已经不能适合现在的应用,而 Postgresql应对现在的高并发业务非常适合,对比如下)
参考《High Performance MysqL》一书,书是2008年6月份出版的(因此可能以下的对比拿到现在会有些出入).
首先简单的介绍一下MysqL的架构,如图:
第一层主要负责处理连接请求,认证,安全。 第二层主要功能包括sql解析,分析,优化器,查询缓存,以及所有的内建函数(如:date,times,math,encryption等),任何与跨存储引擎的功能都在这一层如存储过程,触发器,视图等。 第 三层存储引擎层,负责数据存取,每个存储引擎有各自的特性,就好似UNIX操作系统的各种文件系统。Server 通过存储引擎API与存储引擎交互,API包括一些底层功能,如开始一个事务。存储引擎不干解析sql的事情,引擎之间也不能相互通信(必须通过 Server交换)。只负责相应Server端请求。这里有个例外,因为目前MysqL Server不处理FK关系,而InnoDB是支持FK的,因此在InnoDB中是存储引擎负责解析FK定义的。 存储引擎过多,一个是造成维护的麻烦,开发也会更加复杂,如事务型和非事务型表在同一个事务中的处理,还有引擎间表的互转移,权限和FK丢失等等一系列问题。 下面简单介绍一下MysqL的存储引擎,查看存储引擎: MysqL> SHOW TABLE STATUS LIKE 'user' /G *************************** 1. row *************************** Name: user Engine: MyISAM Row_format: Dynamic Rows: 6 Avg_row_length: 59 Data_length: 356 Max_data_length: 4294967295 Index_length: 2048 Data_free: 0 Auto_increment: NULL Create_time: 2002-01-24 18:07:17 Update_time: 2002-01-24 21:56:29 Check_time: NULL Collation: utf8_bin Checksum: NULL Create_options: Comment: Users and global privileges 1 row in set (0.00 sec) 1. MyISAM : 在MysqL 5.5GA以前,MyISAM一直作为MysqL的默认引擎,拥有支持全文索引,压缩,空间函数等特性,缺点是不支持行锁和事务,因此并发能力极差(insert和select不冲突,其他的写都是排他锁)。 存储: 索引和数据分别存在.MYD和.MYI,文件具有平台无关性,如x86的文件放到PowerPC下使用。 MyISAM可以存储变长记录和固定长度记录,表的定义决定MysqL使用何种方式存放记录,MyISAM可以存放的最大记录数受到文件系统剩余空间 和 单个文件大小上限的限制。在建表时可以使用MAX_ROWS 和AVG_ROW_LENGTH指定最大记录数和平均记录的SIZE。在MysqL5.0版本中,默认MyISAM表的限制是256TB,pointer 占用6 bytes,早期版本默认pointers占用4bytes,因此表的现在是4GB.pointer最大可以占用8bytes CREATE TABLE mytable ( a INTEGER NOT NULL PRIMARY KEY,b CHAR(18) NOT NULL ) MAX_ROWS = 1000000000 AVG_ROW_LENGTH = 32; MysqL> SHOW TABLE STATUS LIKE 'mytable' /G *************************** 1. row *************************** Name: mytable Engine: MyISAM Row_format: Fixed Rows: 0 Avg_row_length: 0 Data_length: 0 Max_data_length: 98784247807 Index_length: 1024 Data_free: 0 Auto_increment: NULL Create_time: 2002-02-24 17:36:57 Update_time: 2002-02-24 17:36:57 Check_time: NULL Create_options: max_rows=1000000000 avg_row_length=32 Comment: 1 row in set (0.05 sec) 特征: reader获得shared lock.writer获得exclusive锁,因此并发性极差。(insert和select 锁不冲突,这要再冲突的话MyISAM估计活不到现在) 自动修复 或 手工修复数据表 check table,repair table或者使用myisamchk 在数据库关闭时修复。(数据容易被破坏,要不整这玩意干啥) 支持BLOB,TEXT前500字符的索引,(据说是为了防止索引过大,所以整了个前500字符的限制,搞个函数索引不就完了么,整这限制干啥) delay_key_write : 即索引的更新在内存中暂缓,降低IO开销,听起来不错,可惜的是如果出现故障,索引要完全重建。 compressed MyISAM table : 使用myisampack可以将myisam表压缩,以行为单位压缩,支持索引,遗憾的是压缩表是只读的。 2. MyISAM Merge引擎 类似视图,把多个MyISAM表合并成一个表对外。 3. InnoDB引擎 InnoDB是一个支持事务的引擎。使用MVCC来满足高并发的场景需求。 一个比较致命的问题是InnoDB的表建立在Clustered Index之上.因此所有的索引都会包含PK的内容,PK必须使用精简列来减少索引的空间占用。 任何改变InnoDB表结构的操作都将导致表和所有索引的重建。 InnoDB支持预加载数据,内存哈希索引,插入缓存等特性来提高性能。 4. 内存存储引擎 之前也被称为heap表,内存表重启后数据将丢失,常用于lookup和mapping表的场景。支持HASH索引。 缺点是不支持事务,使用表级锁,只支持定长的字段类型等。 MysqL在临时表的处理方面,如果没有超出参数指定值的话都将使用内存表来处理,超过将自动转换为MyISAM来处理。 5. 归档引擎 只支持insert和 select,不支持索引,支持行级压缩,支持插入缓存。由于不支持索引,所以在查询方面性能不行,但是MysqL提供了复制,并且可以在SLAVE端使用不同的引擎。这就使得SLAVE端可以选用支持索引的引擎来加快扫描速度。 6. CSV引擎 类似外部表,支持CSV格式的文件,不支持索引。 7. Federated引擎 用于操控远程数据库记录,在统计,JOIN等其他方面使用不是太好。一般用于PK来取数据,或INSERT来插入记录。类似DBLINK,但是功能较弱 8. 黑洞引擎 类似/dev/null,往里面写东西 啥都不干。一般用作数据复制的MASTER,由于MASTER啥都不干,没有IO,提高写入效率。 9. NDB Cluster引擎 一 个shared nothing的存储引擎,包含数据节点,管理节点,sql实例节点。每个数据节点存放部分数据,并且数据节点之间相互有对方的数据,确保数据至少有两份 在不同的节点上。管理节点监控和配置sql集群。由于sql实例和数据节点之间通信频繁,低的延时对NDB 集群非常重要。 10. Falcon引擎 支持MVCC的事务引擎 11. solidDB引擎 支持MVCC的事务引擎,使用集群索引,支持FK,支持在线备份, 12. PBXT引擎 一般用作高并发的写场景,支持MVCC,支持事务,支持FK。使用非集群索引。 13. Maria存储引擎 开发中 Postgresql 包含了几乎所有MysqL这些存储引擎的优点,支持MVCC,支持事务,支持所有事务隔离级别,支持全文索引,支持自动压缩,支持行锁,支持FK,支持 CSV快速导入导出,支持外部表(GreenPlum),支持列存储(GreenPlum),支持资源控制(GreenPlum),支持shared nothing(Plproxy或PGXC,pg-grid,pgpool等都可以做),支持复制(支持master-master,master-slave),支持写规则(比MysqL黑洞引擎更加灵活),支持继承(比merge引擎更加灵活),使用非集群索引,支持手工修正数据 表存储顺序(类似瞬态cluster索引),支持并行运算(GreenPlum)。等等 还有一些其他更加优异的优点: 如: 支持MMAP,将IO请求高的PAGE放入内存区域。更强大的是可以记录下状态,下次开启数据库直接将之加载至内存. 支持部分索引,索引变小,维护开销降低 支持在线备份,支持PITR 支持日志级复制,表级复制,流复制等等 支持非常强大的数据库DBLINK,甚至异构平台,如到oracle,MysqL的 dblink
原文链接:https://www.f2er.com/postgresql/196928.html