mysql中innodb和_MySQL中InnoDB和MyISAM引擎的对比

目录

索引对比

锁对比

事务对比

并发

全文索引对比

外键

其他

一.索引对比

1.B+树概念

我们这里关注B+树的两个特性:

1、 叶子节点包含数据data(data并不特指数据库中的某一行数据,也可以是某个数值,指针等)

2、 叶子节点均在同一层,且每个节点均可以直接找到上一个或者下一个节点(双向指针,比常规的B+树多了一个指向上一个的指针)

336072cf2f5b45a88ab8e61723695da4.png

2.Innodb

以用户表为例,id为主键,另外name存在索引idx_name:

插入数据:

①聚簇索引(聚集索引)

聚簇索引:行数据与键值(主键)紧凑地存储在一起;

InnoDB中表现为:B+树叶子节点的data用于存放行数据(包含主键值、其他列数据、回滚指针、事务id等),物理上索引数据与行数据都放在同一个文件中(.ibd)

b69f964ed2bdb918d1c5c1b702dd67d1.png

②辅助索引

与聚簇索引最大的不同是:B+树的data存放的并不是行数据,而是主键值;

当select * from t_user where name='n1'时,会先通过idx_name索引找到n1对应的主键的值(id=7),再通过主键值找到行数据 [7,n1,70] 。

955433992a4bb3e9e796721a28c89685.png

3.MyISAM 索引

与InnoDB不同,MyISAM并不使用聚簇索引,MyISAM的索引数据和行数据是分开的,物理上分别为.myi索引数据文件和.myd行数据文件(InnoDB 索引和行数据均在.idb文件中)

MyISAM中,主键索引和其他的一般索引在数据结构上并没有什么区别,B+树的data存放的均是数据行地址。

主键索引:

c4eb6f9f0b148a34898ea00a4982e0f3.png

普通索引:

52779bb26f54abe023ab1ad7aca8a1e4.png

二.锁对比

mysql支持三种锁定级别,行级、页级、表级;

MyISAM支持表级锁定,提供与 Oracle 类型一致的不加锁读取(non-locking read in SELECTs)

InnoDB支持行级锁,但值得注意的是InnoDB的行锁是加到索引上的,所以在某次查找时没有用上索引,InnoDB表同样会锁全表。

三.事务对比

InnoDB具有事务,支持4个事务隔离级别,回滚,崩溃修复能力和多版本并发的事务安全,包括ACID。如果应用中需要执行大量的INSERT或UPDATE操作,则应该使用InnoDB,以事务为单位操作可以提高多用户并发操作的性能。

MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。如果应用中需要执行大量的SELECT查询,那么MyISAM是更好的选择

四.并发

MyISAM读写互相阻塞:不仅会在写入的时候阻塞读取,MyISAM还会在读取的时候阻塞写入,但读本身并不会阻塞另外的读。

InnoDB 读写阻塞与事务隔离级别相关。

五.全文索引

MyISAM支持FULLTEXT类型的全文索引

InnoDB不支持FULLTEXT类型的全文索引,但是InnoDB可以使用sphinx插件支持全文索引,并且效果更好

六.外键

MyISAM不支持

InnoDB支持

七.其他

InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描。

MyISAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快;

站在巨人的肩膀上摘苹果:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值