目 录
一、mysql存储引擎 { MyISAM 和 InnoDB的区别}
一、mysql存储引擎 { MyISAM 和 InnoDB的区别}
(一)概念
- MyISAM 是 MySQL 的默认存储引擎。MyISAM 不支持事务、也不支持外键,其优势是访问的速度快,对事务完整性没有要求;对于一些在线分析处理操作速度快。
- InnoDB 存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是对比 MyISAM的存储引擎,InnoDB 写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引。支持事务,主要是面向在线事务处理方面的应用,特点是行锁设计,并支持外键。Innodb采用聚集索引的方式。没有主键,没有唯一键,为每一行生产一个6字节的行id,作为主键。
(二)Myisam 和 InnoDB的区别
1、不支持事务 支持事务(具有提交、回滚、崩溃恢复能力的事务安全)
- InnoDB:支持事务---每一条SQL就是一个事务
- MyISAM:不支持事务 伪事务
2、表锁 行锁
MYISAM:读锁之间共存共享,写锁不共存不共享;读锁写锁不共享;写锁独占一张表)
MYISAM底层自动加锁 select 读锁
Insert、delete、update 写锁
INNODB:力度小,行锁只给一行数据加锁,不影响其他行的执行
读锁和读锁共存共享;读锁和写锁不共存;写锁和写锁不共存
3. 支持全文索引 不支持全文索引
4、不支持外键 支持外键
5、应用场景不同:
MYISAM:适用select频繁,并发少
InnoDB:适用Insert、delete、update频繁,高并发
原因:
(1) MyISAM 仅缓存索引块,而InnoDB缓存 {索引+数据}
(2) InnoDB 回表需要映射块,而MyISAM 直接映射数据地址
(3) InnoDB 需要维护MVCC机制
6、索引不同:
MyISAM 【索引】 叶子节点 = {key , 行数据地址}
InnoDB 【主键索引】 叶子节点 = {主键ID , data数据}
因此 InnoDB根据【主键】索引查询,不需要二次寻址,效率更高
InnoDB 【二级索引】 叶子节点 = {key, 主键ID}
如果过实现索引覆盖,即 要查询列值 全部命中索引,则直接返回
非主键索引的内容
如果为实现索引覆盖,则需要根据【主键ID】做回表
7、存储结构不同:
MyISAM存储结构 = {表定义,MYD数据文件,MYI索引文件}
InnoDB 存储结构 = 索引和数据 集中存储
8、 不带WHERE条件时,【count(*)效率不同 】
MyISAM自带计数器存储保存【总行数】,可直接返回结果
InnoDB 扫描全表计算总行数
Innodb特有的:MVCC是行锁的变种,它想要尽可能地避免加锁操作,实现【非阻塞】读。
从而提高处理并发事务的性能
二、事务
(一)事务的概念
事务由单独单元的一个或多个SQL语句组成,在这个单元中,每个MySQL语句是相互依赖的。而整个单独单元作为一个不可分割的整体,如果单元中某条SQL语句一旦执行失败或产生错误,整个单元将会回滚。所有受到影响的数据将返回到事物开始以前的状态;如果单元中的所有SQL语句均执行成功,则事物被顺利执行。
(二)事务的特性:A C I D
- 原子性 A:一个事务的执行被视为一个不可分割的最小单元。事务里面的操作,要么全部成功执行,要么全部失败回滚,不可以只执行其中的一部分。
- 一致性 C:事务的运行并不改变数据库中数据的一致性 AID是数据库的特征,通过AID手段保证C这个目的
- 隔离性 I:两个以上的事务不会出现交错执行的状态(因为会导致数据不一致)
- 持久性 D:事务提交之后,需要将提交的事务持久化到磁盘。即使系统崩溃,提交的数据也不应该丢失。
讲事务时:
- 先说ACID
- 再讲 I 隔离性
(1)没有隔离性,会产生怎么样的问题
(2)隔离级别和对应的处理
(3)ACD
A 原子性:如何保证原子性----两个日志系统保证原子性和持久性
加锁(不行,断电数据就丢失)
日志系统:redo logc 重做日志 undo logc 未做日志 两个合起来就可保证原子性
redo logc 重做日志 记录了事务将要执行的每一个操作
保存了事务执行过程中的每一个状态点
日志先行---》一旦开启先刷新到磁盘上,事务将要执行的操作永久的保存下来
(三)事务不隔离会产生什么问题(并发事务带来的问题)
- 脏读:事务获取到其他事务执行过程中的结果
- 丢失修改: 事务A 、B都读取同一个数据。事务A 、B先后修改数据,则 第一次修改操作丢失。
- 不可重复读:事务执行过程中读取了其他事务不同阶段的结果(修改操作导致的)
- 幻读:事务执行过程中获取到其他事务不同的阶段的结果(插入或删除的结果导致的)
(四)事务的隔离级别
- 未提交读 会出现脏读、不可重复读、幻读的问题
- 已提交读 会出现不可重复读和幻读的问题
- 可重复读 会出现幻读的情况(MySQL 默认 且通过其他机制 间隙锁解决幻读问题)
- 可序列化 串行处理,效率差 上表锁,读写相互阻塞。效率低下 无并发问题
InnoDB引擎默认实现 可重复读隔离级别