暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

DB宝 2017-03-31
1142

Q
题目如下所示:


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


     

A
答案如下所示:


答案:MyISAM支持表锁,不支持事务,表损坏率较高。它分为2种类型的文件:以MYD作为后缀名的数据文件和以MYI作为后缀名的索引文件。MyISAM读写并发不如InnoDB,适用于INSERT较多的场景,且支持直接复制文件,用以备份数据,是MySQL公司开发的,物理文件主要有数据文件,日志文件和索引文件,并且这三个文件是单独存在。

InnoDB支持行锁,支持事务,支持行级锁,CRASH后具有RECOVER机制,只有ibd文件,分为数据区和索引区,有较好的读写并发能力,但做COUNT运算时相当消耗CPU,是InnoDB公司开发的。物理文件有日志文件,数据文件和索引文件。其中,索引文件和数据文件是放在一个目录下,可以设置共享文件、独享文件两种格式。

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

MyISAMInnoDB的区别


MyISAM

InnoDB

构成上的区别

每个MyISAM在磁盘上存储成三个文件。每一个文件的名字就是表的名字,文件名都和表名相同,扩展名指出文件类型。

表定义的扩展名为.frmframe,存储表定义)。

数据文件的扩展名为.MYDMYData,存储数据)。

索引文件的扩展名是.MYIMYIndex,存储索引)。

数据文件和索引文件可以放置在不同的目录下,平均分布I/O,获得更快的速度。

只有ibd文件,分为数据区和索引区,有较好的读写并发能力。物理文件有:日志文件、数据文件和索引文件。其中,索引文件和数据文件是放在一个目录下,可以设置共享文件与独享文件两种格式。基于磁盘的资源是InnoDB表空间数据文件和它的日志文件,InnoDB表的大小只受限于操作系统文件的大小,一般为2GBInnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是对比MyISAM的存储引擎,InnoDB写的处理效率差一些,并且会占用更多的磁盘空间以保留数据和索引。

事务处理上方面

MyISAM类型的表强调的是性能,其执行速度比InnoDB类型更快,但是不提供事务支持。

InnoDB提供事务支持事务、外键等高级数据库功能。

SELECT

UPDATE

INSERT

DELETE

如果执行大量的SELECT,那么MyISAM是更好的选择。

1)如果执行大量的INSERTUPDATE,那么出于性能方面的考虑,应该使用InnoDB表。

2)当执行DELETE FROM table时,InnoDB不会重建表,而是一行一行地删除。

3LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。

清空表

MyISAM会重建表。

InnoDB是一行一行地删除,效率非常慢。

AUTO_INCREMENT列的操作

MyISAMINSERTUPDATE操作自动更新这一列。AUTO_INCREMENT值可用ALTER TABLE来重置。

对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其它字段一起建立联合索引。

如果为一个表指定AUTO_INCREMENT列,那么在数据字典里的InnoDB表句柄包含一个名为自动增长计数器的计数器,它被用在为该列赋新值,自动增长计数器仅被存储在主内存中,而不是存在磁盘上。InnoDB中必须包含只有该字段的索引。

表的行数

当执行SQL语句“SELECT COUNT(*) FROM TABLE”时,MyISAM只是简单地读出保存好的行数,需要注意的是,当COUNT(*)语句包含WHERE条件时,MyISAMInnoDB的操作是一样的。

InnoDB中不保存表的具体行数,也就是说,当执行SELECT COUNT(*) FROM TABLE时,InnoDB要扫描一遍整个表来计算行数。

表级锁定(更新时锁定整个表):其锁定机制是表级索引,这虽然可以让锁定的实现成本很小,但是也同时大大降低了其并发性能。

不支持行级锁,只支持并发插入的表锁,主要用于高负载的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%"




DB笔试面试历史连接

http://mp.weixin.qq.com/s/Vm5PqNcDcITkOr9cQg6T7w




About Me:小麦苗

 本文作者:小麦苗,只专注于数据库的技术,更注重技术的运用

● 作者博客地址:http://blog.itpub.net/26736162/abstract/1/

 文章内容来源于作者的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解

 版权所有,欢迎分享本文,转载请保留出处


长按下图识别二维码或微信扫描下图二维码来关注小麦苗的微信公众号:xiaomaimiaolhr,学习最实用的数据库技术。

最后修改时间:2020-01-10 21:18:26
文章转载自DB宝,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论