MyISAM 和 InnoDB 讲解
来源:互联网 发布:钉钉软件使用说明 编辑:程序博客网 时间:2024/05/21 06:16
MyISAM 和 InnoDB 讲解
InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定。基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持已经外部键等高级数据库功能。
以下是一些细节和具体实现的差别:
◆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%”
两种类型最主要的差别就是Innodb 支持事务处理与外键和行级锁.而MyISAM不支持.所以MyISAM往往就容易被人认为只适合在小项目中使用。
我作为使用MySQL的用户角度出发,Innodb和MyISAM都是比较喜欢的,但是从我目前运维的数据库平台要达到需求:99.9%的稳定性,方便的扩展性和高可用性来说的话,MyISAM绝对是我的首选。
原因如下:
1、首先我目前平台上承载的大部分项目是读多写少的项目,而MyISAM的读性能是比Innodb强不少的。
2、MyISAM的索引和数据是分开的,并且索引是有压缩的,内存使用率就对应提高了不少。能加载更多索引,而Innodb是索引和数据是紧密捆绑的,没有使用压缩从而会造成Innodb比MyISAM体积庞大不小。
3、从平台角度来说,经常隔1,2个月就会发生应用开发人员不小心update一个表where写的范围不对,导致这个表没法正常用了,这个时候MyISAM的优越性就体现出来了,随便从当天拷贝的压缩包取出对应表的文件,随便放到一个数据库目录下,然后dump成sql再导回到主库,并把对应的binlog补上。如果是Innodb,恐怕不可能有这么快速度,别和我说让Innodb定期用导出xxx.sql机制备份,因为我平台上最小的一个数据库实例的数据量基本都是几十G大小。
4、从我接触的应用逻辑来说,select count(*) 和order by 是最频繁的,大概能占了整个sql总语句的60%以上的操作,而这种操作Innodb其实也是会锁表的,很多人以为Innodb是行级锁,那个只是where对它主键是有效,非主键的都会锁全表的。
5、还有就是经常有很多应用部门需要我给他们定期某些表的数据,MyISAM的话很方便,只要发给他们对应那表的frm.MYD,MYI的文件,让他们自己在对应版本的数据库启动就行,而Innodb就需要导出xxx.sql了,因为光给别人文件,受字典数据文件的影响,对方是无法使用的。
6、如果和MyISAM比insert写操作的话,Innodb还达不到MyISAM的写性能,如果是针对基于索引的update操作,虽然MyISAM可能会逊色Innodb,但是那么高并发的写,从库能否追的上也是一个问题,还不如通过多实例分库分表架构来解决。
7、如果是用MyISAM的话,merge引擎可以大大加快应用部门的开发速度,他们只要对这个merge表做一些select count(*)操作,非常适合大项目总量约几亿的rows某一类型(如日志,调查统计)的业务表。
当然Innodb也不是绝对不用,用事务的项目如模拟炒股项目,我就是用Innodb的,活跃用户20多万时候,也是很轻松应付了,因此我个人也是很喜欢Innodb的,只是如果从数据库平台应用出发,我还是会首选MyISAM。
另外,可能有人会说你MyISAM无法抗太多写操作,但是我可以通过架构来弥补,说个我现有用的数据库平台容量:主从数据总量在几百T以上,每天十多亿 pv的动态页面,还有几个大项目是通过数据接口方式调用未算进pv总数,(其中包括一个大项目因为初期memcached没部署,导致单台数据库每天处理 9千万的查询)。而我的整体数据库服务器平均负载都在0.5-1左右。
----------------------------------------------------------------------------------------------------------------------------------------------------------
Myisan存储引擎的每一个表被存放为3个表名命名的物理文件。
.frm文件 .myd(表数据) .myi(索引数据)
myisam 支持3种索引:
a. B-Tree 索引 所有的索引节点都按照 balance tree 的数据结构来存储,所有的索引数
据节点都在叶节点。
b. R-Tree 索引 与b-Tree有点区别 主要设计用于为存储空间和多维数据的字段做索引
目前的MySQL版本仅支持 geometry类型的字段做索引
c.Full-Text 索引 全文索引 存储结构也是B-Tree ,主要为了解决当需要用like查询时的
低效率问题。
三种索引类型中,最常使用的是B-Tree 索引了,偶尔使用Full- text,但R-Tree 索引在一般
系统中很少使用到。B-Tree 有一个限制就是参与一个索引的所有字段的长度之和不能超过1000字
节。
myisam 表存放在一个相同后缀名的.myd 文件中,但是每一个文件的存放格式并不完全一样,因
为myisam的数据存放格式分为静态 fixed 固定长度,动态 dynamic 可变长度及压缩 compress 三
种格式。
Myisam 存储引擎的某个表文件出错以后,仅影响到该表,不会影响到其他表,更不会影响到
数据库。 如果数据库运行过程中发现myisam表出现了问题,则可以通过 Check table命令来尝试
校验她,并可以通过 repair table 命令来尝试修复。 在数据库关闭状态下,也可以通过
myisamchk工具来对数据库中的某个(或某些)表进行检测或修复。 不过不建议不要轻易对表进行
修复操作,修复之前尽量做好可能的备份工作,以免带来不必要的后果。
另外, Myisam 存储引擎的表理论上是可以被多个数据库实例同时使用同时操作,但是一般不
允许这样做, 尽量不要在多个MySQLd之间共享myisam存储文件。
--------------------------------------------------------------------------------
InnoDB
特点:
1.支持事务安全
2.数据多版本读取 通过undo信息实现数据的多版本读取
3.锁定机制的改进
InnoDB改变了MyISAM 的锁机制,实现了行锁;行锁是通过索引完成 ,行锁定机制也无
疑为InnoDB在承受高并发压力的环境下增强了不小的竞争力。
4.实现外键
实现外键引用,使在数据库端控制部分数据的完整性成为可能。虽然许多调优专家不建
议这么做,但对不少用户从低成本考虑,还是经常使用的。
在物理方面 他和MYISAM不大一样, 也有用.frm文件存放表结构定义相关的元数据,但
是表数据和索引数据存放在一起的
至于每表单独使用独享空存放还是所有表一起使用共享空间,完全由用户决定,同时还
支持符号链接。
物理结构:
1.数据文件 表数据和索引数据 包含所有的主键和其他普通索引
表空间份为2种 1 共享表空间 也就是所有表数据、索引数据、各种元数据及事务的UNDO数
据被存放在同一个表空间(一个或多个数据文件)中,通过innodb_data_file_path来指定,增加数
据文件要停机重启。
2.独享表空间 也就是每个表的数据和索引被存放在一个单独的.ibd文件中,该文件包括每个
表的表数据,索引数据,及该表的相关事务UNDO数据。
虽然共享表空间和独享表空间可以自由选择,但是但是共享表空间是必须存在的,因为InnoDB
各表的很多元数据信息都是存放在共享表空间中的。
共享表空间的数据文件可以设置为固定大小 和可动态扩展两种方式 ,动态扩展形式的文件可
以设置文件的容量和每次的扩展量 。在创建字段扩展的数据文件时,建议大家最好加上最大尺寸
的属性, 因为1系统文件本身就有一定的大小限制 但InnoDB不知道2 是自身维护的方便,另外
InnoDB不仅可以使用文件系统,也可以使用裸设备 RAW Device
当我们共享文件快使用完时,必须要为其增加数据文件。其操作很简单,只需要在
innodb_data_file_path 参数后面安卓标准格式设置好文件路径和相关属性即可,不过这里有一点
需要注意的,就是innoDB在创建新数据库文件的时候是不会创建目录的,如果指定的目录不存在,
则会报错,导致MySQL无法启动。另一个令人头疼的问题是innodb在给共享表空间增加数据文件之
后,必须要重启数据库才能生效,如果要使用裸设备,还必须要重启2次,这是不大喜欢使用共享
表空间而用独享表空间的一个原因
2.日志文件
跟Oracle的redo日志比较类似,同样采用轮循策略来写入。
如果你的数据库中使用了INNODB的表,那么千万不要删除InnoDB的日志文件,因为这可能使你
的数据库崩溃,且无法重新启动。
由于InnoDB是事务安全的存储引擎,所以系统崩溃对他来说并不可能造成太大的损失,因为由
于redo日志的存在,且还有checkpoint机制的保护,InnoDB完全可以通过Redo日志讲数据库崩溃时
已经完成但还没有来得及将内存中已经修改的但未完全写入磁盘的未完成事务进行回滚操作 undo,
保证数据的一致性。
InnoDB不能在功能特性方面和MyISAM存储引擎有较大的区别,配置上也是单独处理的
在Mysql启动参数文件设置中,InnoDB的所有参数都带有前缀“innodb_”,不论是和InnoDB数据及
日志相关的,还是和其他一些性能,事务等相关参数都是一样。和所有InnoDB相关的系统变量一样
,所有与InnoDB相关的系统状态值夜会同样以" Innodb_" 为前缀。也完全可以通过一个参数
(skip-innodb)来屏蔽Mysql中的InnoDB存储引擎,这样即使在安装编译的时候将InnoDB存储引擎
安装进去了,使用者也无法创建InnoDB的表。
- MyISAM 和 InnoDB 讲解
- MyISAM 和 InnoDB 讲解
- MyISAM 和 InnoDB 讲解
- MyISAM 和 InnoDB 讲解
- MyISAM 和 InnoDB 讲解
- MyISAM 和 InnoDB 讲解
- MyISAM 和 InnoDB 讲解
- MyISAM 和 InnoDB 讲解
- MyISAM 和 InnoDB 讲解
- MyISAM 和 InnoDB 讲解
- MyISAM 和 InnoDB 讲解
- MyISAM 和 InnoDB 讲解
- MyISAM 和 InnoDB 讲解
- MyISAM 和 InnoDB 讲解
- MyISAM 和 InnoDB 讲解
- MyISAM 和 InnoDB 讲解
- MyISAM 和 InnoDB 讲解
- MyISAM 和 InnoDB 讲解
- 直面W5100发热问题
- IIS7+ - 如何让Url Rewrite Outbound Rule和Dynamic Compression同时工作
- sqlserver 查看语句执行时间
- 某机字长为32位,存储容量为64MB,若按字节编址.它的寻址范围是多少?
- 完整的PHP图形验证码程序源码
- MyISAM 和 InnoDB 讲解
- DB2静态SQL和动态SQL 的比较与实践
- UNIX SIGTERM等信号意义 .
- .net webrequest应用
- 来自日本的下载站
- idhttpserver关闭后重起报端口已被绑定问题的解决办法
- 点击屏幕其他地方让edittext失去焦点 的实现
- 文件编码格式
- Web开发者必知的10个职业常识