共计 3207 个字符,预计需要花费 9 分钟才能阅读完成。
这篇文章主要讲解了“InnoDB 和 MyISAM 有哪些区别”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着丸趣 TV 小编的思路慢慢深入,一起来研究和学习“InnoDB 和 MyISAM 有哪些区别”吧!
MyISAM: 这个是默认类型, 它是基于传统的 ISAM 类型,ISAM 是 Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写, 它是存储记录和文件的标准方法. 与其他存储引擎比较,MyISAM 具有检查和修复表格的大多数工具. MyISAM 表格可以被压缩, 而且它们支持全文搜索. 它们不是事务安全的, 而且也不支持外键。如果事物回滚将造成不完全回滚,不具有原子性。如果执行大量的 SELECT,MyISAM 是更好的选择。 www.2cto.com
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,或者用 dump。 www.2cto.com
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: www.2cto.com
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. 启动 my 的命令行中添加了以下参数可以使新发布的 mysql 数据表都默认为使用事务(
只影响到 create 语句。)
–default-table-type=InnoDB
测试命令: www.2cto.com
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
或:
mysqld -max -nt –standalone –default-table-type=InnoDB
感谢各位的阅读,以上就是“InnoDB 和 MyISAM 有哪些区别”的内容了,经过本文的学习后,相信大家对 InnoDB 和 MyISAM 有哪些区别这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是丸趣 TV,丸趣 TV 小编将为大家推送更多相关知识点的文章,欢迎关注!