一、数据库事务简介
写这篇文章初衷是有一个大佬告诉我,,他面试第一个问题就喜欢问InnoDB和MyISAM区别,所以想了想抽时间整理一下相关内容,哈哈欢迎阅读!
要讲解InnoDB,MyISAM 首先一定要知道数据库事务!
数据库事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。
事务特性(ACID)
A: Atomicity, 原子性:事务是最小的操作序列单元,一个事务中包含的所有操作在一次执行后要么全部操作成功,要么全部操作失败,也就是说如果事务执行过程中出错,那么就会回滚到事务开始前的状态
C: Consistency, 一致性:指事务的执行不能破坏数据库数据的完整性和一致性,例如A向B转账,如果事务中只给B的账户增加了余额而A的余额不变,那么就破坏了数据的一致性
I: Isolation, 隔离性:不同的事务并发操作相同的数据时,每个事务都有各自完整的数据空间,不应互相干扰
D: Duration, 持久性:事务一旦提交,对数据的修改便被永久保留
例:打个很简单的比方,我辰兮购买CSDN会员花费300元
整体执行算是一个事务,首先我的余额减少300,然后CSDN账户余额增加300
如果我支付成功这里我的账户余额就会少,但是如果这时候突然出现异常情况,这时候CSDN账户没有增加300,那么这个业务就算是失败的,事务的原子性和一致性就提到要不全部执行,要不就不执行,如果执行一半事务一致性也会破坏
例:常见比如你要删除一个用户的信息,肯定是删除用户表信息,用户详情表信息
删除相关信息就要删除的彻彻底底,你执行一个事务就要将这个事务执行完整,业务逻辑也要符合实际场景,这才合情合理
总结:事务是由一系列对数据的访问与更新操作组成的程序执行逻辑单元
二、InnoDB 和 MyISAM
面试中也经常考到InnoDB和MyISAM区别?
1、InnoDB 支持事务,MyISAM 不支持事务。这是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因之一;
2、 InnoDB 支持外键,而 MyISAM 不支持。对一个包含外键的 InnoDB 表转为 MYISAM 会失败;
3、InnoDB 是聚集索引,MyISAM 是非聚集索引。聚簇索引的文件存放在主键索引的叶子节点上,因此 InnoDB 必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。而 MyISAM 是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。
4、 InnoDB 不保存表的具体行数,执行 select count(*) from table 时需要全表扫描。而MyISAM 用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快;
5、InnoDB 最小的锁粒度是行锁,MyISAM 最小的锁粒度是表锁。一个更新语句会锁住整张表,导致其他查询和更新都会被阻塞,因此并发访问受限。这也是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因之一;
注意:目前 MySQL 将默认存储引擎 InnoDB,支持事务,支持行锁支持外键
根据实际场景选择不同的数据库引擎:
1.是否要支持事务,如果要请选择 InnoDB,如果不需要可以考虑 MyISAM;
2. 如果表中绝大多数都只是读查询,可以考虑 MyISAM,如果既有读写也挺频繁,请使用InnoDB。
3. 系统奔溃后,MyISAM恢复起来更困难,能否接受,不能接受就选 InnoDB;
4.MySQL5.5版本开始Innodb已经成为Mysql的默认引擎(之前是MyISAM),说明其优势是有目共睹的。
根据自己实际的场景选择不同的数据库即可,如果你不知道用什么存储引擎,那就用InnoDB吧,毕竟是mysql目前默认引擎。
三、MYSQL引擎简介
上面的InnoDB和MyISAM都是MYSQL引擎,我们是否真正了解过引擎概念呢?
简介一下MYSQL引擎相关知识:
MYSQL存储数据时,有不同的存储方式,这些方式都使用了不同的底层实现(如:存储机制,索引技巧,索引技巧,锁定水平),底层实现的差异带来的功能也就不同。在不同的场景下使用合适的存储方式就能让你的数据读写速度更快或者获得额外的功能。
MYSQL主要有什么存储引擎?
主要的有: MyIsam , InnoDB, Mrg_Myisam, Memory, Blackhole, CSV, Performance_Schema, Archive, Federated
数据库查询语句中可用通过 show engines 查看你的MYSQL的存储引擎
拓展:【数据库】Mysql更改默认引擎为Innodb的步骤方法
InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定。
基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持以及外部键等高级数据库功能。
我为什么要改默认引擎,其实原因很简单,我使用的Mysql默认引擎是MyISAM,而MyISAM并不支持事务处理,所以我需要更换它的引擎。
更改 Mysql 默认引擎为 InnoDB步骤如下:
Mysql默认是关闭InnoDB存储引擎的使用的,将InnoDB设置为默认的引擎如下。
1. 查看Mysql存储引擎情况: mysql>show engines InnoDB | YES,说明此Mysql数据库服务器支持InnoDB引擎。
2. 设置InnoDB为默认引擎:在配置文件my.ini中的 [mysqld] 下面加入default-storage-engine=INNODB
3. 重启Mysql服务器
4. 登录Mysql数据库,mysql>show engines 如果出现 InnoDB |DEFAULT,则表示设置InnoDB为默认引擎成功。
The best investment is to invest in yourself.
愿你们奔赴在自己的热爱里!