mysql数据据存储引擎InnoDB和MyISAM的上风及辨别[网络技术]
本文“mysql数据据存储引擎InnoDB和MyISAM的上风及辨别[网络技术]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
MyISAM:这个是默许范例,它是基于传统的ISAM范例,ISAM是Indexed Sequential Access Method (有索引的次序拜候办法) 的缩写,它是存储记录和文件的尺度办法.与其他存储引擎对比,MyISAM具有查抄和修复表格的大大都工具. MyISAM表格可以被紧缩,并且它们支持全文搜索.它们不是事件安全的,并且也不支持外键.假如事物回滚将造成不完好回滚,不具有原子性.假如履行大量的SELECT,MyISAM是更好的挑选.
InnoDB:这种范例是事件安全的.它与BDB范例具有相同的特点,它们还支持外键.InnoDB表格速度很快.具有比BDB还丰富的特点,因此假如需求一个事件安全的存储引擎,倡议利用它.假如你的数据履行大量的INSERT或UPDATE,出于性能方面的考虑,应当利用InnoDB表,
关于支持事物的InnoDB范例的标,影响速度的主要缘由是AUTOCOMMIT默许设置是翻开的,并且程序没有显式调用BEGIN 开始事件,招致每插入一条都自动Commit,严重影响了速度.可以在履行sql前调用begin,多条sql形成一个事物(即便autocommit翻开也可以),将大大提高性能.
===============================================================
InnoDB和MyISAM是在利用MySQL最常用的两个表范例,各有优缺陷,视具体利用而定.下面是已知的二者之间的差别,仅供参考.
innodb
InnoDB 给 MySQL 供应了具有事件(commit)、回滚(rollback)和崩溃修复本领(crash recovery capabilities)的事件安全(transaction-safe (ACID compliant))型表.InnoDB 供应了行锁(locking on row level),供应与 Oracle 范例一致的不加锁读取(non-locking read in SELECTs).这些特点均提高了多用户并发操作的性能表现.在InnoDB表中不需求扩大锁定(lock escalation),因为 InnoDB 的列锁定(row level locks)适合非常小的空间.InnoDB 是 MySQL 上第一个供应外键约束(FOREIGN KEY constraints)的表引擎.
InnoDB 的计划目标是处理大容量数据库系统,它的 CPU 操纵率是别的基于磁盘的关系数据库引擎所不能比的.在技术上,InnoDB 是一套放在 MySQL 后台的完好数据库系统,InnoDB 在主内存中成立其专用的缓冲池用于高速缓冲数据和索引. InnoDB 把数据和索引存放在表空间里,大概包含多个文件,这与别的的不一样,举例来说,在 MyISAM 中,表被存放在单独的文件中.InnoDB 表的大小只受限于操作系统的文件大小,普通为 2 GB.
InnoDB全部的表都保存在同一个数据文件 ibdata1 中(也大概是多个文件,大概是独立的表空间文件),相对来说对比不好备份,免费的筹划可以是拷贝数据文件、备份 binlog,大概用 mysqldump.
MyISAM
MyISAM 是MySQL缺省存贮引擎 .
每张MyISAM 表被存放在三个文件 .frm 文件存放表格定义. 数据文件是MYD (MYData) . 索引文件是MYI (MYIndex) 引伸.
因为MyISAM相对简单所以在效率上要优于InnoDB..小型利用利用MyISAM是不错的挑选.
MyISAM表是保存成文件的情势,在跨平台的数据转移中利用MyISAM存储会省去不少的麻烦
以下是一些细节和具体实现的差别:
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%”
任何一种表都不是万能的,只用得当的针对业务范例来挑选符合的表范例,才能最大的施展MySQL的性能上风.
===============================================================
以下是InnoDB和MyISAM的一些接洽和辨别!
1. 4.0以上mysqld都支持事件,包含非max版本.3.23的需求max版本mysqld才能支持事件.
2. 成立表时假如不指定type则默许为myisam,不支持事件.
可以用 show create table tablename 号令看表的范例.
2.1 对不支持事件的表做start/commit操作没有任何效果,在履行commit前已经提交,测试:
履行一个msyql:
use test;
drop table if exists tn;
create table tn (a varchar(10)) type=myisam;
drop table if exists ty;
create table ty (a varchar(10)) type=innodb;
begin;
insert into tn values('a');
insert into ty values('a');
select * from tn;
select * from ty;
都能看到一条记录
履行另一个mysql:
use test;
select * from tn;
select * from ty;
只有tn能看到一条记录
然后在另一边
commit;
才都能看到记录.
3. 可以履行以下号令来切换非事件表到事件(数据不会丧失),innodb表比myisam表更安全:
alter table tablename type=innodb;
3.1 innodb表不能用repair table号令和myisamchk -r table_name
但可以用check table,以及mysqlcheck [OPTIONS] database [tables]
4. 启动mysql数据库的号令行中增添了以下参数可以使新公布的mysql数据表都默许为利用事件(
只影响到create语句.)
--default-table-type=InnoDB
测试号令:
use test;
drop table if exists tn;
create table tn (a varchar(10));
show create table tn;
5. 暂时改变默许表范例可以用:
set table_type=InnoDB;
show variables like 'table_type';
或:
c:\mysql\bin\mysqld-max-nt --standalone --default-table-type=InnoDB
以上是“mysql数据据存储引擎InnoDB和MyISAM的上风及辨别[网络技术]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |