MySQL的强大之处在于它的插件式存储引擎,我们可以基于表的特点使用不同的存储引擎,从而达到最好的性能。
下面我们来认识一下MySQL各表存储引擎的特点:
InnoDB存储引擎
特点:
1,支持事务,主要面向在线事务处理(OLTP)方面的应用。
2,行锁设计,支持外键,并支持orcle的非锁定读,即默认情况下读取操作不加锁。
3,第三方存储引擎,被orcle收购。
4,windows版本默认存储引擎,其他系统mysql默认存储引擎为MyISAM。
设计理念:
1,InnoDB默认将数据放到一个逻辑的表空间中,这个表空间就像黑盒子一样由InnoDB自身进行管理。从mysql4.1开始,它可以将每个InnoDB存储引擎的表单独存放到一个独立的ibd文件中。与orcle类似,InnoDB存储引擎同样可以使用裸设备(row disk)来建立其表空间。
2,InnoDB通过使用多版本并发控制(MVCC)来获取高并发性,并且实现了sql标准的4种隔离级别,默认为REPEATABLE级别。同时使用一种next-key-locking的策略来避免幻读(phantom)。除此之外,InnoDB存储引擎还提供插入缓存(insert buffer),二次写(double write),自适应哈希索引(adaptive hash index),预读(read ahead)等高性能和高可用的功能。
MyISAM存储引擎
特点:
1,不支持事务,表锁(表级锁,加锁会锁住整个表),支持全文索引,对于一些OLAP(online analytical processing,在线分析处理)操作速度快
2,官方存储引擎,除windows版本外,是所有mysql版本的默认存储引擎。
设计理念:
1,myisam存储引擎表由myd和myi组成。myd用来存放数据文件,myi用来存放索引文件,可以通过myisampack工具进一步压缩数据文件,因为该工具使用huffman编码静态算法来压缩数据。因此,使用该工具压缩后的表是只读的,当然也可以通过myisampack来解压数据文件。
2,mysql5.0之前,myisam默认支持的表大小为4g,如果需要支持大于4g的myisam表时,则需要制定Max_Rows和AVG_ROW_LENGTH属性。从mysql5.0版本开始,myisam默认支持256T的单表数据,足够满足一般应用的需求。
3,对于myisam存储引擎表,mysql数据库只缓存其索引文件,数据文件的缓存由操作系统本身来完成。这与其他使用LRU算法缓存数据的大部分数据库大不相同。此外,在mysql5.1.23版本之前,无论是在32b或64b的操作系统环境中,缓存索引的缓存区最大只能设置为4g,在之后的版本中,64位系统可以支持大于4g的索引缓存区。
NDB存储引擎
NDB存储引擎是一个集群存储引擎,类似于orcle的rac集群,不过与rac share everything结构不同的是,其结构是share nothing的集群结构,因此能提供更高级别的高可用性。
特点:
1,数据全部放在内存中,从5.1版本开始,可以将非索引数据放在磁盘上,因此主键查找的速度极快,并且通过添加ndb数据存储引擎节点(Data Node)可以线性地提高数据库性能,是高可用,高性能的集群系统。
2,ndb存储引擎的连接操作(join)是在mysql数据库层完成的,而不是在存储引擎层完成的,这意味着复杂的连接操作需要巨大的网络开销,因此,查询速度很慢,这是ndb的瓶颈。
Memory存储引擎
memory存储引擎(之前称为heap存储引擎)将表中的数据存放在内存中,如果数据库重启或发生崩溃,表中的数据都会消失。它非常适合用于存放临时数据的临时表,以及数据仓库的纬度表,默认使用哈希索引,而不是b+树索引。
使用限制:memory存储引擎只支持表锁,并发性能较差,并且不支持text和blob列类型。最重要的是,存放变长字段(varchar)时,按照定常字段的方式进行存放,造成内存浪费。此外,mysql数据库使用临时表存放查询的中间结果集(intermediate result)。如果中间结果集大于memory存储引擎表的容量设置,或中间结果集含有text或blob字段,则mysql数据库会把其转换到myisam存储引擎表而存放到磁盘。由于myisam不缓存数据文件,因此这时产生的临时表的性能对于查询会有损失。
Archive存储引擎
特点:
1,archive存储引擎只支持insert和select操作,mysql5.1开始支持索引。使用zlib算法将数据行进行压缩后存储,压缩比率一般可达1:10
2,archive存储引擎非常适用于存储归档数据,如日志信息。
3,archive存储引擎使用行锁来实现高并发的插入操作。由于本身不是事务安全的存储引擎,其设计目标主要是提供高速的插入和压缩功能。
Maria存储引擎
maria存储引擎是新开发的引擎,设计目标主要是用来取代原有的myisam存储引擎,从而成为mysql的默认存储引擎。
特点:
1,缓存数据和索引文件,行锁设计,提供mvcc功能,支持事务和非事务安全的选项支持,及更好的blob字段类型的处理性能。
查看当前使用的mysql数据库所支持的存储引擎:
show enegines \g