Mysql中的存储引擎Innodb与Myisam简单对比

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Tacks/article/details/80627929

一 InnoDB

1.1 mysql5.5以后的默认存储引擎

在mysql客户端中输入语句查询一下mysql所有的存储引擎
show engines \G;
innodb
提供事务(supports transactions)事务安全型存储引擎 数据完整安全
行级锁定(row-level locking)
外键约束(foreign keys)

1.2存储格式

数据与索引集中存储在同一个表空间文件,数据的物理组织形式是簇表 ,数据按照主键顺序物理分布,数据节点每页16k
数据(记录行)
索引(一种索引机制,也需要一定的空间)
跟着建一个简单的表来看一下Innodb的存储文件

Create table innodb_one (
    Id int unsigned not null auto_increment,
    Name varchar(32) not null default '',
    Primary key (id)
)engine=innodb charset=utf8;

紧接着看mysql下的文件

*.frm文件 数据表的结构定义
*.idb文件 InnoDB的数据与索引

(当设置innodb_file_per_table为1表示使用独立表空间,一般会先开辟较大的空间,当数据一定时候再扩大文件)
file
使用独立表空间,在自己文件中存储每个InnoDB表以及索引
这里写图片描述
默认的 的innodb表的表空间文件
data
插入时候做排序工作,效率低.
order

1.3维护数据完整性

事务:一组sql语句 集体成功或者都失败
事务ACID特性完整支持
回滚段失败回滚 A
支持主外键约束 C
事务版本+回滚段=MVCC I
事务日志持久化 D
外键约束:(在php程序中就可以判断解决/数据库管理员用外键约束)

1.4并发性处理

擅长处理并发
行级锁定 :一定情况下可进行行级锁来提升并发性,当然也可以进行表级锁定(自己选择)
多版本并发控制MVCC: 无阻塞读操作(再更新之前先复制之前的版本 直接读原来的)

1.5锁

当客户端操作表(记录)时,为了保证操作的隔离性(多个客户端不能互相影响)
通过加锁来处理,
操作方面
读锁(共享锁S-lock,阻塞其他客户端的写操作),
写锁(独占锁或排他锁X-lock,阻塞其他客户端的读写操作)
锁定粒度(范围)
行级 对于并发性比较好 row-level locking 实现了行级锁,但是锁的开销大
表级 不利于并发性

1.6小结

优点:数据完整性【事务,外键约束】
并发行处理【行级锁定,多版本控制】
缺点 : 高速检索
高速插入【需要进行排序后插入】

二 Myisam

2.1 mysql5.0/5.1的时候版本默认的存储引擎

ISAM (索引顺序存取方法)最初是IBM公司发展起来的一个文件系统,可以连续地(按照他们进入的顺序)或者任意地(根据索引)记录任何访问。每个索引定义了一次不同排列的记录。后来mysql就改了改出来了myisam
myisam

2.2存储方式

    Create table myisam_one (
        Id int unsigned not null auto_increment,
        Name varchar(32) not null default '',
        Primary key (id)
    )engine= myisam charset=utf8;

生成以下文件

*.frm 数据表的结构定义
*.MYD myisam的表数据(mydata)
*.MYI myisam的索引数据(myindex)

file_myisam
插入数据查看,并没有按照id排序插入,插入速度快,空间占用量小
insert
如同复制,可以看数据成倍增加,数据文件大小的变化

--用于成倍插入数据--
insert into myisam_one select null,name from myisam_one;
--刷新到磁盘上--
flush table myisam_one;

2.3功能

提供高速存储和检索,以及全文搜索能力,适合 数据仓库等频繁的查询应用
全文索引支持(>=5.6 innodb也支持)查询非常频繁
全文索引是指对char、varchar和text中的每个词(停用词除外)建立倒排序索引。
数据压缩存储,压缩优势空间减少,减少磁盘IO开销
myisampack
压缩后表为只读表,不能修改 ,可以用于不经常改变的数据,例如城市名。
如果需要更新,需要解压后更新,再进行压缩myiamchk -unpack)
.MYD数据文件的压缩存储 myisamPack
数据被压缩,而索引未被压缩
Myisampack myisam_one
压缩后要修复索引
myisamchk -rq myisam_one
并发性:仅仅支持表级锁定,并发性差,但是支持并发插入(写操作中的插入操作)

三 两者对比

3.1索引

索引:myisam的索引和数据是分开的,并且索引是有压缩的,内存使用率就对应提高了不少,而Innodb是索引和数据放在一起,且没有使用压缩,因而Innodb比myisam体积更大。myisam每张表都包括三种文件:表定义文件(.frm)、数据文件(.myd)和索引文件(.myi),而Innodb通常许多表保存在同一个文件中。此外,如果表数据非常大,通常也使用myisam。

3.2事务

myisam类型的表强调的是性能,其执行数度比Innodb类型更快,但是不提供事务支持,而InnoDB类型支持,可靠性要求比较高.
innodb的AUTOCOMMIT默认是打开的,即每条SQL语句会默认被封装成一个事务,自动提交,这样会影响速度,但是比较可靠,对于金钱股票等数据要求性比较高使用Innodb.

3.3外键

InnoDB支持外键,myisam不支持。

3.4全文索引

InnoDB不支持全文索引,而myisam支持。全文索引是指对char、varchar和text中的每个词(停用词除外)建立倒排序索引。

3.4select update insert delete操作

如果执行大量的select ,myisam是更好的选择.
如果你的数据执行大量的insert 或update ,出于性能方面的考虑,应该使用InnoDB表
delete from table时,InnoDB不会重新建立表,而是一行一行的删除.

3.5锁

在执行数据库写入的操作(insert,update,delete)的时候,mysiam表会锁表,而innodb表会锁行

3.6并发性处理

innodb支持行级锁,多版本并发控制MVCC对并发性支持比较好
如果和myisam比insert写操作的话,Innodb还达不到myisam的写性能,如果是针对基于索引的update操作,虽然myisam可能会逊色Innodb,但是那么高并发的写,从库能否追的上也是一个问题,还不如通过多实例分库分表架构来解决。

猜你喜欢

转载自blog.csdn.net/Tacks/article/details/80627929