【MySQL】--存储引擎和事务

                              目                         录

一、mysql存储引擎  { MyISAM 和 InnoDB的区别} 

(一)概念

(二)Myisam          和       InnoDB的区别

二、事务

(一)事务的概念

(二)事务的特性:A C I D

(三)事务不隔离会产生什么问题(并发事务带来的问题)

(四)事务的隔离级别


一、mysql存储引擎  { MyISAM 和 InnoDB的区别} 

(一)概念

  1. MyISAM MySQL 的默认存储引擎。MyISAM 不支持事务、也不支持外键,其优势是访问的速度快,对事务完整性没有要求;对于一些在线分析处理操作速度快。
  2. 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:事务提交之后,需要将提交的事务持久化到磁盘。即使系统崩溃,提交的数据也不应该丢失。

讲事务时:

  1. 先说ACID
  2. 再讲 I 隔离性

      (1)没有隔离性,会产生怎么样的问题

      (2)隔离级别和对应的处理

      (3)ACD

   A 原子性:如何保证原子性----两个日志系统保证原子性和持久性

   加锁(不行,断电数据就丢失)

  日志系统:redo logc 重做日志    undo logc 未做日志  两个合起来就可保证原子性

  redo logc 重做日志  记录了事务将要执行的每一个操作

           保存了事务执行过程中的每一个状态点

  日志先行---》一旦开启先刷新到磁盘上,事务将要执行的操作永久的保存下来 

 

(三)事务不隔离会产生什么问题(并发事务带来的问题)

  1. 脏读:事务获取到其他事务执行过程中的结果
  2. 丢失修改: 事务A 、B都读取同一个数据。事务A 、B先后修改数据,则 第一次修改操作丢失。 
  3. 不可重复读:事务执行过程中读取了其他事务不同阶段的结果(修改操作导致的)
  4. 幻读:事务执行过程中获取到其他事务不同的阶段的结果(插入或删除的结果导致的)

(四)事务的隔离级别

  1. 未提交读   会出现脏读、不可重复读、幻读的问题
  2. 已提交读   会出现不可重复读和幻读的问题
  3. 可重复读   会出现幻读的情况(MySQL 默认  且通过其他机制 间隙锁解决幻读问题)
  4. 可序列化   串行处理,效率差 上表锁,读写相互阻塞。效率低下 无并发问题

 InnoDB引擎默认实现 可重复读隔离级别

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值