mysql数据存储引擎InnoDB和MyISAM的优势及区别是什么

68次阅读
没有评论

共计 3370 个字符,预计需要花费 9 分钟才能阅读完成。

这篇文章主要介绍“mysql 数据存储引擎 InnoDB 和 MyISAM 的优势及区别是什么”,在日常操作中,相信很多人在 mysql 数据存储引擎 InnoDB 和 MyISAM 的优势及区别是什么问题上存在疑惑,丸趣 TV 小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”mysql 数据存储引擎 InnoDB 和 MyISAM 的优势及区别是什么”的疑惑有所帮助!接下来,请跟着丸趣 TV 小编一起来学习吧!

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,或者用 dump。

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. 启动 my 的命令行中添加了以下参数可以使新发布的 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:mysqlinmysqld-max-nt –standalone –default-table-type=InnoDB

到此,关于“mysql 数据存储引擎 InnoDB 和 MyISAM 的优势及区别是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注丸趣 TV 网站,丸趣 TV 小编会继续努力为大家带来更多实用的文章!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-03发表,共计3370字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)