Mysql数据库引擎对比

mysql可以将数据以不同的技术存储在文件(内存)中,这种技术就称为存储引擎。

这里写图片描述
每一种存储引擎使用不同的存储机制、索引技巧、锁定水平,最终提供广泛且不同的功能。类型有MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、FEDERATED、ARCHIVE、CSV、BLACKHOLE。

数据的大小,及什么样的业务场景影响着我们对引擎的选择,大尺寸的数据集趋向于选择InnoDB方式,因为其支持事务处理和故障恢复。对于数据库故障恢复的时间,InnoDB可以利用事务日志进行数据恢复,会比较快,可能是几分钟。而MyISAM可能会需要几个小时甚至几天来干这些事。 当然,若是有备份的情况下或者是从生产库抽出来的离线数据做的二次数据分析,MYISAM还是不错的选择。
对于大批的inserts 语句在MyISAM下会快一些,但是updates 在InnoDB 下会更快一些——尤其在并发量大的时候。

MyISAM (不同场景下优点缺点是相对)
优点:MyISAM引擎设计简单,支持索引(包括全文检索)、表级锁定、数据可压缩,存储限制可达256TB。。数据以紧密格式存储,强调了快速读取操作,进行的大量数据读取操作有很大的优势,适用于事务的处理不多的情况。
缺点:MyISAM不支持事务、也不支持外键,对事务完整性没有要求,MyISAM格式的文件缺陷就是不能在表损坏后恢复数据。

InnoDB:
优点:支持事务和索引,锁颗粒为行锁,适用于事务处理比较多,存储限制为64TB,外键支持,支持崩溃修复能力和并发控制。如果需要对事务的完整性要求比较高(比如银行),要求实现并发控制(比如售票),那选择InnoDB有很大的优势。如果需要频繁的更新、删除操作的数据库,也可以选择InnoDB,因为支持事务的提交(commit)和回滚(rollback)。
缺点:
1.InnoDB不支持FULLTEXT类型的索引。
2.InnoDB 中不保存表的具体行数,也就是说,执行select count() from table时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count()语句包含 where条件时,两种表的操作是一样的。
3.对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。
4.DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。
5.LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。
另外,InnoDB表的行锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如 update table set num=1 where name like “%aaa%”

memery
优点: 所有的数据都在内存中,数据的处理速度快如果需要很快的读写速度,对数据的安全性要求较低,可以选择MEMOEY。每个基于MEMORY存储引擎的表实际对应一个磁盘文件。该文件的文件名与表名相同,类型为frm类型。该文件中只存储表的结构。而其数据文件,都是存储在内存中,这样有利于数据的快速处理,提高整个表的效率。适用于相对较小的数据库表。
缺点:它对表的大小有要求,不能建立太大的表,安全性不高。

猜你喜欢

转载自blog.csdn.net/louisjh/article/details/79026899