MYSQL中存储引擎

数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,现在许多不同的数据库管理系统都支持多种不同的数据引擎。以MySQL为例,不需要在整个服务器中使用同一种存储引擎,可以针对具体的要求,对每一个表使用不同的存储引擎。

预计阅读时间:8 分钟

1、查看MySQL存储引擎
可以使用命令行窗口或者数据库图形化工具(例如Navicat for MySQL、SQLyog、MySQL Workbench、MySQLDumper等),输入

SHOW ENGINES 

查看MySQL存储引擎,得到结果如下:
在这里插入图片描述
可以看出来,MySQL的默认存储引擎是InnoDB,并且支持多种存储引擎可供选择。

2、存储引擎简析
InnoDB存储引擎
(1)特点:

  • InnoDB存储引擎支持事务,回滚以及系统崩溃修复能力和多版本迸发控制的事务的安全。
  • InnoDB支持自增长列(auto_increment),支持外键(foreignkey)
  • InnoDB支持mvcc的行级锁
  • InnoDB存储引擎索引使用的是B+Tree,聚集索引

(2)InnoDB 中事务隔离性的实现
在InnoDB中,事务隔离级别采用的是可重读(Repeatable reads),该级别在提升并发能力以及减少所操作方面所做的处理如下:
1)MVCC机制:是基于数据版本( Version )记录机制的乐观锁实现的,在InnoDB中,会在每行数据后添加两个额外的隐藏的值来实现MVCC,这两个值一个记录这行数据何时被创建,另外一个记录这行数据何时过期(或者被删除)。

  • SELECT时,读取创建版本号<=当前事务版本号,删除版本号为空或>当前事务版本号。
  • INSERT时,保存当前事务版本号为行的创建版本号
  • DELETE时,保存当前事务版本号为行的删除版本号
  • UPDATE时,插入一条新纪录,保存当前事务版本号为行创建版本号,同时保存当前事务版本号到原来删除的行

2)快照读:
首先需要注意的是MySQL中的读和事务隔离级别中的读是不一样的,具体分为快照读 (snapshot read)和当前读 (current read):
快照读是读取历史数据的方式,对应SQL语句就是select

select * from table ….;

当前读是读取数据库当前版本数据的方式,对应特殊的读操作(插入/更新/删除),处理的都是当前的数据,需要加Next-Key锁处理当前读中的幻读问题

select * from table where ? lock in share mode;
select * from table where ? for update;
insert;
update ;
delete;

MyISAM存储引擎
(1)特点:

  • MyISAM 这种存储引擎不支持事务,不支持行级锁,只支持并发插入的表锁,主要用于高负载的select。
  • MyISAM 类型的表支持三种不同的存储结构:静态型(表列大小固定)、动态型(空间少,但碎片造成性能降低)、压缩型(只读表,减少占用空间)。
  • MyISAM也使用B+tree索引但和Innodb的在具体实现上有些不同,是非聚集索引。

MEMORY存储引擎
(1)特点:

  • 基于memory存储引擎的表实际对应一个磁盘文件,该文件只存储表的结构,而其数据文件都是存储在内存中,这样有利于对数据的快速处理,提高整个表的处理能力。
  • memory存储引擎文件数据都存储在内存中,如果mysqld进程发生异常,重启或关闭机器这些数据都会消失。所以memory存储引擎中的表的生命周期很短,一般只使用一次。
  • memory存储引擎默认使用哈希(HASH)索引,其速度比使用B-+Tree型要快,如果读者希望使用B树型,则在创建的时候可以引用。

2、存储引擎的选择
在这里插入图片描述
(1)InnoDB引擎:InnoDB提供事务支持以及外部键等高级数据库功能。如果系统读少,写多的时候,尤其是并发写入高的时候,InnoDB就是首选了。

(2)MyISAM引擎:数据表,能提供较高的查询效率。MyISAM相对简单所以在效率上要优于InnoDB.如果系统主要用来插入和查询记录,读多写少对原子性要求低,那么MyISAM最好的选择,且MyISAM恢复速度快,可直接用备份覆盖恢复。
注解:INNODB在做SELECT的时候,要维护的东西比MYISAM引擎多很多:
1)INNODB要缓存数据块,MYISAM只缓存索引块,这中间还有换进换出的减少;
2)INNODB寻址要映射到块再到行,MYISAM记录的直接是文件的OFFSET偏移,定位比INNODB要快;
3)INNODB还需要维护MVCC一致。

(3)Memory引擎:只是临时存放数据,数据量不大,并且不需要较高的数据安全性,可以选择将数据保存在内存中的,MySQL使用该引擎作为临时表,存放查询的中间结果

尾注:更多及时干货,请关注微信公众号:JAVA万维猿圈
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值