MyISAM和InnoDB各有哪些特性?分别适用在怎样的场景下?

0    72    1

👉 本文共约1615个字,系统预计阅读时间或需7分钟。

MyISAM支持表锁,不支持事务,表损坏率较高,主要面向OLAP的应用。MyISAM读写并发不如InnoDB,适用于以SELECT和INSERT为主的场景,且支持直接复制文件,用以备份数据。只缓存索引文件,不缓存数据文件。

InnoDB支持行锁,支持事务,CRASH后具有RECOVER机制,其设计目标主要面向OLTP的应用。

它们之间其它的区别可以参考下表:

表 4-6 MyISAM和InnoDB的区别

MyISAMInnoDB
构成上的区别每个存储引擎类型为MyISAM的表在磁盘上存储成3个文件:文件扩展名为.frm(frame)的文件存储了表定义;文件扩展名为.MYD(MYData)的文件存储了表数据;文件扩展名为.MYI(MYIndex)的文件存储了索引。数据文件和索引文件可以放置在不同的目录下,平均分布I/O,获得更快的速度。每个存储引擎类型为InnoDB的表在磁盘上存储成2个文件:.frm和ibd文件。.frm文件存储了表定义。ibd文件分为数据区和索引区,有较好的读写并发能力。
事务处理MyISAM类型的表强调的是性能,其执行速度比InnoDB类型更快,但是不提供事务支持。InnoDB提供事务支持、外键等高级数据库功能。InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是对比MyISAM的存储引擎,InnoDB写的处理效率差一些,并且会占用更多的磁盘空间以保留数据和索引。
适用场景如果执行大量的SELECT,那么MyISAM是更好的选择。1.如果执行大量的INSERT或UPDATE,那么出于性能方面的考虑,应该使用InnoDB表。2.当执行DELETE FROM table时,InnoDB不会重建表,而是一行一行地删除。3.LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。
清空表MyISAM会重建表。InnoDB是一行一行地删除,效率非常慢。
对AUTO_INCREMENT列的操作1.MyISAM为INSERT和UPDATE操作自动更新这一列。AUTO_INCREMENT值可用ALTER TABLE来重置。2.对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其它字段一起建立联合索引。如果为一个表指定AUTO_INCREMENT列,那么在数据字典里的InnoDB表句柄包含一个名为自动增长计数器的计数器,它被用在为该列赋新值,自动增长计数器仅被存储在主内存中,而不是存在磁盘上。InnoDB中必须包含只有该字段的索引。
表的行数当执行SQL语句“SELECT COUNT(*) FROM TABLE”时,MyISAM只是简单地读出保存好的行数,需要注意的是,当COUNT(*)语句包含WHERE条件时,MyISAM和InnoDB的操作是一样的。InnoDB中不保存表的具体行数,也就是说,当执行SELECT COUNT(*) FROM TABLE时,InnoDB要扫描一遍整个表来计算行数,所以,InnoDB在做COUNT运算时相当消耗CPU。
表级锁定(更新时锁定整个表):其锁定机制是表级索引,这虽然可以让锁定的实现成本很小,但是也同时大大降低了其并发性能。不支持行级锁,只支持并发插入的表锁,主要用于高负载的SELECT。提供行锁(locking on row level),提供与Oracle类型一致的不加锁读取(non-locking read),另外,InnoDB表的行锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,那么InnoDB表同样会锁全表,例如UPDATE TABLE T_TEST_LHR SET NUM=1 WHERE NAME LIKE "%LHR%"
开发公司MySQL公司InnoDB公司
是否默认存储引擎是(5.5.8以前)是(5.5.8及其以后)

标签:

头像

小麦苗

学习或考证,均可联系麦老师,请加微信db_bao或QQ646634621

您可能还喜欢...

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

3 + 17 =

 

嘿,我是小麦,需要帮助随时找我哦
  • 18509239930
  • 个人微信

  • 麦老师QQ聊天
  • 个人邮箱
  • 点击加入QQ群
  • 个人微店

  • 回到顶部
返回顶部