存储引擎指定了表的类型,即如何存储和索引数据、是否支持事务等,同时存储引擎也决定了表在计算机中的存储方式。
查看MySQL支持的存储引擎:命令:show engines;
- MyISAM引擎特点:
- 不支持事务:事务是指逻辑上的一组操作,组成这组操作的各个单元,要么全成功要么全失败。
- 表级锁定:数据更新时锁定整个表:也就是对表中的一个数据进行操作都会将这个表锁定,其他人不能操作这个表,这虽然可以让锁定的实现成本很小但是也同时大大降低了其并发性能。
- 读写互相阻塞:不仅会在写入的时候阻塞读取,MyISAM还会在读取的时候阻塞写入,但读本身并不会阻塞另外的读。
- 只会缓存索引:MyISAM可以通过key_buffer_size的值来提高缓存索引,以大大提高访问性能减少磁盘IO,但是这个缓存区只会缓存索引,而不会缓存数据。
- 读取速度较快:占用资源相对较少
- 不支持外键约束,但只是全文索引
- MyISAM引擎是MySQL5.5版本之前的默认引擎,是对最初的ISAM引擎优化的产物。
- MyISAM引擎适用的生产业务场景 1. 不需要事务支持的业务(例如转账就不行,充值也不行) 2. 一般为读数据比较多的应用,读写都频繁场景不适合,读多或者写多的都适合。 3. 读写并发访问都相对较低的业务(纯读纯写高并发也可以)(锁定机制问题) 4. 数据修改相对较少的业务(阻塞问题) 5. 以读为主的业务,例如:www.blog,图片信息数据库,用户数据库,商品库等业务 6. 对数据一致性要求不是很高的业务。 7. 中小型的网站部分业务会用。
小结:单一对数据库的操作都可以示用MyISAM,所谓单一就是尽量纯读,或纯写(insert,update,delete)等。
InnoDB引擎InnoDB引擎为目前MySQL AB所发行新版的标准。 和其他的存储引擎相比,InnoDB引擎的优点是支持兼容ACID的事务,以及参数完整性(即对外键的支持)。
- InnoDB引擎特点: 1. 支持事务:支持4个事务隔离界别,支持多版本读。 2. 行级锁定(更新时一般是锁定当前行):通过索引实现,全表扫描仍然会是表锁,注意间隙锁的影响。 3. 读写阻塞与事务隔离级别相关(有多个级别)。 4. 具体非常高效的缓存特性:能缓存索引,也能缓存数据。 5. 整个表和主键与Cluster方式存储,组成一颗平衡树。 6. 所有SecondaryIndex都会保存主键信息。 7. 支持分区,表空间,类似oracle数据库。 8. 支持外键约束;外键约束其实降低了表的查询速度,但是增加了表之间的耦合度。 9. 和MyISAM引擎比较,InnoDB对硬件资源要求还是比较高的。 10. 可以通过自动增长列,方法是auto_increment。 11. 使用的锁粒度为行级锁,可以支持更高的并发; 12. 配合一些热备工具可以支持在线热备份; 13. 在InnoDB中存在着缓冲管理,通过缓冲池,将索引和数据全部缓存起来,加快查询的速度; 14. 对于InnoDB类型的表,其数据的物理组织形式是聚簇表。所有的数据按照主键来组织。数据和索引放在一块,都位于B+数的叶子节点上;
当然InnoDB的存储表和索引也有下面两种形式:
- 使用共享表空间存储:所有的表和索引存放在同一个表空间中。
- 使用多表空间存储:表结构放在frm文件,数据和索引放在IBD文件中。分区表的话,每个分区对应单独的IBD文件,分区表的定义可以查看我的其他文章。使用分区表的好处在于提升查询效率。 对于InnoDB来说,最大的特点在于支持事务。但是这是以损失效率来换取的。
- InnoDB引擎适用的生产业务场景 1. 需要事务支持(具有较好的事务特性,例银行业务) 2. 行级锁定对高并发有很好的适应能力,但需要确保查询是通过索引完成。 3. 数据更新较为频繁的场景,如:BBS(论坛)、SNS(社交平台)、微博等 4. 数据一致性要求较高的业务,例如:充值转账,银行卡转账。 5. 硬件设备内存较大,可以利用InnoDB较好的缓存能力来提高内存利用率,尽可能减少磁盘IO,可以通过一些参数来设置 6. 相比MyISAM引擎,Innodb引擎更消耗资源,速度没有MyISAM引擎快
2003 年,MySQL AB 公司从 Sony Ericsson 公司收购了 NDB 存储引擎。 NDB 存储引擎是一个集群存储引擎,类似于 Oracle 的 RAC 集群,不过与 Oracle RAC 的 share everything 结构不同的是,其结构是 share nothing 的集群架构,因此能提供更高级别的 高可用性。NDB 存储引擎的特点是数据全部放在内存中(从 5.1 版本开始,可以将非索引数 据放在磁盘上),因此主键查找(primary key lookups)的速度极快,并且能够在线添加 NDB 数据存储节点(data node)以便线性地提高数据库性能。由此可见,NDB 存储引擎是高可用、 高性能、高可扩展性的数据库集群系统,其面向的也是 OLTP 的数据库应用类型。
Memory 存储引擎正如其名,Memory 存储引擎中的数据都存放在内存中,数据库重 启或发生崩溃,表中的数据都将消失。它非常适合于存储 OLTP 数据库应用中临时数据的临时表,也可以作为 OLAP 数据库应用中数据仓库的维度表。Memory 存储引擎默认使用哈希 索引,而不是通常熟悉的 B+ 树索引。 将数据存在内存,为了提高数据的访问速度,每一个表实际上和一个磁盘文件关联。文件是frm。
- 支持的数据类型有限制,比如:不支持TEXT和BLOB类型,对于字符串类型的数据,只支持固定长度的行,VARCHAR会被自动存储为CHAR类型;
- 支持的锁粒度为表级锁。所以,在访问量比较大时,表级锁会成为MEMORY存储引擎的瓶颈;
- 由于数据是存放在内存中,一旦服务器出现故障,数据都会丢失;
- 查询的时候,如果有用到临时表,而且临时表中有BLOB,TEXT类型的字段,那么这个临时表就会转化为MyISAM类型的表,性能会急剧降低;
- 默认使用hash索引。
- 如果一个内部表很大,会转化为磁盘表。
第三方的存储引擎。其特点是存储是按照列而非行的,因此非常 适合 OLAP 的数据库应用。其官方网站是 http://www.infobright.org/,上面有不少成功的数据 仓库案例可供分析。
NTSE 存储引擎网易公司开发的面向其内部使用的存储引擎。目前的版本不支持事务, 但提供压缩、行级缓存等特性,不久的将来会实现面向内存的事务支持。
BLACKHOLE黑洞存储引擎,可以应用于主备复制中的分发主库。