当前位置: 首页 > 科技观察

MySQL常用存储引擎简单分析

时间:2023-03-12 07:39:46 科技观察

MyISAM是MySQL(5.5版本之前)默认的数据库引擎,由早期的ISAM(IndexedSequentialAccessMethod:索引顺序访问方法)改进而来。虽然性能优秀,但它有一个缺点:不支持事务处理(transaction)。InnoDB是MySQL的数据库引擎之一,是MySQLAB发布二进制文件的标准之一。与传统的ISAM和MyISAM相比,InnoDB最大的特点是:支持事务(Transaction)。MyISAM和InnoDB有什么区别?总结如下:1.存储结构MyISAM:每个MyISAM在磁盘上存储为三个文件。第一个文件的名称以表名开头,扩展名表示文件类型。.frm文件存储表定义。数据文件的扩展名为.MYD(MYData)。索引文件的扩展名为.MYI(MYIndex)。InnoDB:所有的表都存储在同一个数据文件(或多个文件,或独立的表空间文件)中,InnoDB表的大小只受操作系统文件大小的限制,一般为2GB。2、存储空间MyISAM:可压缩,存储空间小。支持三种不同的存储格式:静态表(默认,但注意数据末尾不能有空格,会去掉)、动态表、压缩表。InnoDB:需要更多的内存和存储空间,它会在主存中建立自己的专用缓冲池,用于缓存数据和索引。3、可移植性、备份和恢复MyISAM:数据以文件的形式存储,跨平台数据传输会很方便。备份和恢复时可以独立操作一张表。InnoDB:免费方案可以是复制数据文件,备份binlog,或者使用mysqldump,数据量达到几十G的时候比较痛苦。4、事务支持MyISAM:强调性能,每个查询都是原子的,执行速度比InnoDB类型快,但不提供事务支持。InnoDB:提供事务支持事务,外键等高级数据库功能。具有提交、回滚和崩溃恢复功能的事务安全(符合ACID)表。***UTO_INCREMENTMyISAM:可以和其他字段创建联合索引。引擎的自增长列必须是索引。如果是复合索引,自增长列不需要是第一列。可以按照前几列排序,然后递增。InnoDB:InnoDB必须包含一个只有这个字段的索引。引擎的自动增长列必须是索引,如果是复合索引,也必须是复合索引的第一列。6、表锁区别MyISAM:只支持表级锁。当用户操作MyISAM表时,select、update、delete、insert等语句会自动锁定表。如果锁表满足insert的并发,可以在表尾插入新数据。InnoDB:支持事务和行级锁,这是innodb最大的特点。行锁大大提高了多用户并发操作的性能。但是InnoDB的行锁只对WHERE的主键有效,非主键的WHERE会锁住整张表。7、全文索引MyISAM:支持FULLTEXT类型的全文索引InnoDB:不支持FULLTEXT类型的全文索引,但是innodb可以使用sphinx插件支持全文索引,效果更好。8、表主键MyISAM:允许没有任何索引和主键的表存在,索引就是保存行的地址。InnoDB:如果没有设置主键或非空唯一索引,会自动生成一个6字节的主键(用户不可见)。数据是主索引的一部分,附加索引存储主索引的值。9、表的具体行数MyISAM:保存表的总行数,ifselectcount()fromtable;会直接取出值。InnoDB:未保存表中的总行数。如果你使用selectcount()fromtable;会遍历整个表,消耗很大。但是,加上wehre条件后,myisam和innodb的处理方式是一样的。10、CURD操作MyISAM:如果进行大量SELECT,MyISAM是更好的选择。InnoDB:如果你的数据执行了大量的INSERT或UPDATE,出于性能原因,你应该使用InnoDB表。DELETEInnoDB在性能上更好,但是DELETEFROMtable时,InnoDB不会重新创建表,而是逐行删除。如果要清空InnoDB上数据量较大的表,最好使用truncatetable命令。11、外键MyISAM:不支持InnoDB:支持通过上面的分析,基本上可以考虑用InnoDB来代替MyISAM引擎,但是在实际应用中,具体情况可以自己考虑。