3.Mysql索引、事务与存储引擎二

文章目录

  • Mysql索引、事务与存储引擎二
    • 事务
      • 事务的概念
      • 事务的ACID特点
        • 原子性
        • 一致性
        • 隔离性
          • 事务之间的相互影响
          • 事物隔离级别
          • 查询全局事务隔离级别
          • 查询会话事务隔离级别(只对当前连接有效)
          • 设置全局事务隔离级别
          • 设置会话事务隔离级别
        • 持久性
      • 事务控制语句
    • 存储引擎
      • 概念
      • MyISAM
        • 特点
        • MyISAM表支持3种不同的存储格式
        • MyISAM适用的生产场景举例
      • InnoDB
        • InnoDB特点介绍
        • InnoDB适用生产场景分析
      • 企业选择存储引擎依据
      • 区别
      • 管理存储引擎
        • 查看系统支持的存储引擎
        • 查看表使用的存储引擎
        • 修改存储引擎
          • 通过alter table修改
          • 通过修改/etc/my.cnf 配置文件,指定默认存储引擎并重启服务
          • 通过create table 创建表时指定存储引擎
    • 死锁
      • 介绍

Mysql索引、事务与存储引擎二

事务

事务的概念

  • 事务是一种机制、一个操作序列,包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这组数据库命令要么都执行,要么都不执行。
  • 事务是一个不可分割的工作逻辑单元,在数据库系统上执行并发操作时,事务是最小的控制单元。
  • 事务适用于多用户同时操作的数据库系统的场景,如银行、保险公司及证券交易系统等等。
  • 事务通过事务的整体性以保证数据的一致性。
  • 说白了,所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。

事务的ACID特点

ACID,是指在可靠数据库管理系统(DBMS) 中,事务(transaction)应该具有的四个特性:原子性(Atomicity) 、一致性 (Consistency)、隔离性(Isolation) 、持久性(Durability) 。这是可靠数据库所应具备的几个特性。

原子性

  • 原子性:指事务是一个不可再分割的工作单位,事务中的操作要么都发生,要么都不发生。
  • 事务是一个完整的操作,事务的各元素是不可分的。
  • 事务中的所有元素必须作为一个整体提交或回滚。
  • 如果事务中的任何元素失败,则整个事务将失败。

一致性

  • 一致性:指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。.
  • 当事务完成时,数据必须处于一致状态。
  • 在事务开始前,数据库中存储的数据处于一致状态。
  • 在正在进行的事务中,数据可能处于不一致的状态。
  • 当事务成功完成时,数据必须再次回到已知的一致状态。

隔离性

  • 隔离性:指在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。
  • 对数据进行修改的所有并发事务是彼此隔离的,表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务。
  • 修改数据的事务可在另一个使用相同数据的事务开始之前访问这些数据,或者在另一个使用相同数据的事务结束之后访问这些数据。
事务之间的相互影响
  • 脏读 :一个事务可以看到另一个事务没有提交的修改数据
  • 不可重复读 :在一个事务里的两次查询会看到数据不一致的情况,这种情况可能因为两次查询过程中间有其它事务修改了数据并已提交
  • 幻读 :在一个事务里的两次查询会看到数据不一致的情况(可能是发现之前没有的数据),这种情况可能因为两次查询过程中间有其它事务插入了新的数据并已提交
  • 丢失更新 :一个事务修改数据并提交可能会覆盖另一个事务修改和提交的数据
事物隔离级别
  1. 未提交读 read uncommitted:读取尚未提交的数据:不解决脏读
  2. 提交读read committed:读取已经提交的数据:可以解决脏读
  3. 可重复读 repeatable read:重读读取:可以解决脏读和不可重复读—mysql默认的
  4. 串行读serializable:串行化:可以解决脏读不可重复读和虚读—相当于锁表,会影响数据库读写效率和性能
  5. mysql默认的事务处理级别是repeatable read,而Oracle和SQL Server是read committed 。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cQQwUc0n-1686896560434)(null)]

  • 事务隔离级别的作用范围分为两种:
    • 全局级:对所有的会话有效.
    • 会话级:只对当前的会话有效
查询全局事务隔离级别
show global variables like '%isolation%';

SELECT @@global.tx_isolation;
查询会话事务隔离级别(只对当前连接有效)
show session variables like '%isolation%';

SELECT @@session.tx_isolation;

SELECT @@tx_isolation;
设置全局事务隔离级别
set global transaction isolation level read committed;

set @@global.tx_isolation='read-committed';

##设置会立即生效,但是是临时设置,重启后就失效
设置会话事务隔离级别
set session transaction isolation level repeatable read;

set @@esession.tx_isolation='repeatable-read';

持久性

  • 在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚
  • 指不管系统是否发生故障,事务处理的结果都是永久的
  • 一旦事务被提交,事务的效果会被水久地保留在数据库中

总结:在事务管理中,原子性是基础,隔离性是手段,一致性是目的, 持久性是结果。

事务控制语句

BEGIN或START TRANSACTION:显式地开启一个事务。

COMMIT或COMMITWORK:提交事务,并使已对数据库进行的所有修改变为永久性的。

ROLLBACK或ROLLBACK WORK:回滚会结束用户的事务,并撤销正在进行的所有未提交的修改。

SAVEPOINT S1:使用 SAVEPOINT 允许在事务中创建一个回滚点,一个事务中可以有多SAVEPOINT;“S1”代表回滚点名称。

ROLLBACK TO [SAVEPOINT] S1:把事务回滚到标记点。
begin;    
##开启一个事务



commit;
##提交事务

rollback;
##撤销事务
SET AUTOCOMMIT=0;	#禁止自动提交

SET AUTOCOMMIT=1;	#开启自动提交,Mysq1默认为1

SHOW VARIABLES LIKE 'AUTOCOMMIT';    #查看Mysql中的AUTOCOMMIT值
  • 如果没有开启自动提交,当前会话连接的mysql的所有操作都会当成一个事务直到你输入rollback或commit;当前事务才算结束。
  • 当前事务结束前新的mysql连接时无法读取到任何当前会话的操作结果。
  • 如果开起了自动提交,mysql 会把每个sql语句当成一个事务,然后自动的commit。
  • 当然无论开启与否,begin; commit|rollback; 都是独立的事务。

存储引擎

概念

  • MySQL中的数据用各种不同的技术存储在文件中,每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力,这些不同的技术以及配套的功能在MySQL中称为存储引擎

  • 存储引擎是MySQL将数据存储在文件系统中的存储方式或者存储格式

  • MySQL常用的存储引擎

    • MyISAM
    • InnoDB
  • MySQL数据库中的组件,负责执行实际的数据I/O操作

  • MySQL系统中,存储引擎处于文件系统之上,在数据保存到数据文件之前会传输到存储引擎,之后按照各个存储引擎的存储格式进行存储

MyISAM

特点

  • MyISAM不支持事务,也不支持外键约束,只支持全文索引,数据文件和索引文件是分开保存的

  • 访问速度快,对事务完整性没有要求

  • MyISAM适合查询、插入为主的应用

  • MyISAM在磁盘.上存储成三个文件,文件名和表名都相
    同,但是扩展名分别为:

    • .frm文件存储表结构的定义
    • 数据文件的扩展名为.MYD (MYData)
    • 索引文件的扩展名是.MYI (MYIndex)
  • 表级锁定形式,数据在更新时锁定整个表

  • 数据库在读写过程中相互阻塞

    • 会在数据写入的过程阻塞用户数据的读取
    • 也会在数据读取的过程中阻塞用户的数据写入
  • 数据单独写入或读取,速度过程较快且占用资源相对少。

  • MyIAM支持的存储格式

    • 静态表
    • 动态表
    • 压缩表

MyISAM表支持3种不同的存储格式

  1. 静态(固定长度)表
    • 静态表是默认的存储格式。静态表中的字段都是非可变字段,这样每个记录都是固定长度的。
    • 这种存储方式的优点是存储非常迅速,容易缓存,出现故障容易恢复;
    • 缺点是占用的空间通常比动态表多。
  2. 动态表
    • 动态表包含可变字段,记录不是固定长度的。
    • 这样存储的优点是占用空间较少,但是频繁的更新、删除记录会产生碎片,需要定期执行OPTIMIZE TABLE语句或myisamchk -r命令来改善性能,并且出现故障的时候恢复相对比较困难。
  3. 压缩表
    • 压缩表由myisamchk工具创建,占据非常小的空间,因为每条记录都是被单独压缩的,所以只有非常小的访问开支。

MyISAM适用的生产场景举例

  1. 公司业务不需要事务的支持
  2. 单方面读取或写入数据比较多的业务
  3. MyISAM存储引擎数据读写都比较频繁场景不适合
  4. 使用读写并发访问相对较低的业务
  5. 数据修改相对较少的业务
  6. 对数据业务一致性要求不是非常高的业务
  7. 服务器硬件资源相对比较差

InnoDB

InnoDB特点介绍

  • 支持事务, 支持4个事务隔离级别
  • MySQL从5.5.5版本开始,默认的存储引擎为InnoDB
  • 读写阻塞与事务隔离级别相关
  • 能非常高效的缓存索引和数据
  • 表与主键以簇的方式存储
  • 支持分区、表空间,类似oracle数据库
  • 支持外键约束,5.5前不支持全文索引,5.5后支持全文索引
  • 对硬件资源要求还是比较高的场合
  • 行级锁定,但是全表扫描仍然会是表级锁定,如
update table set a=1 where user like "%zhang%";
InnoDB中不保存表的行数,如'select count(*) from table;'时InnoDB需要扫描一遍整个表来计算有多少行,
但是MyISAM只要简单的读出保存好的行数即可。需要注意的是当count(*)语句包含where条件时MyISAM也需要扫描整个表
  • 对于自增长的字段,InnoDB 中必须包含只有该字段的索引,但是在MyISAM表中可以和其他字段一起建立组合索引
  • 清空整个表时,InnoDB 是一行一行的删除,效率非常慢。MyISAM则会重建表

InnoDB适用生产场景分析

  1. 业务需要事务的支持
  2. 行级锁定对高并发有很好的适应能力,但需确保查询是通过索引来完成
  3. 业务数据更新较为频繁的场景,如:论坛,微博等
  4. 业务数据一致性要求较高,如:银行业务
  5. 硬件设备内存较大,利用InnoDB较好的缓存能力来提高内存利用率,减少磁盘IO的压力

企业选择存储引擎依据

  • 需要考虑每个存储引擎提供了哪些不同的核心功能及应用场景

  • 支持的字段和数据类型

    • 所有引|擎都支持通用的数据类型
    • 但不是所有的引擎都支持其它的字段类型,如二进制对象
  • 锁定类型:不同的存储引擎支持不同级别的锁定

    • 表锁定: MyISAM支持
    • 行锁定: InnoDB支持
  • 索引的支持

    • 建立索引在搜索和恢复数据库中的数据时能显著提高性能
    • 不同的存储引擎提供不同的制作索引的技术
    • 有些存储引擎根本不支持索引
  • 事务处理的支持

    • 提高在向表中更新和插入信息期间的可靠性
    • 可根据企业业务是否要支持事务选择存储引擎

区别

  • MyISAM: 不支持事务、外键约束,只支持表级锁定,适合单独的查询或插入操作,读写并发能力较弱,支持全文索引,资源占用较小,数据文件(. MYD)和索引文件(.MYI)是分开存储的。

    • 推荐使用场景:适用于不需要事务处理,单独的查询或者插入数据的业务场景
  • InnoDB:支持事务、 外键约束,支持行级锁定(在全表扫描时仍然会表级锁定),读写并发能力较好,支持全文索引(5.5版本以后的),缓存能力较好可以减少磁盘I0的压力,数据文件也是索引文件

    • 推荐使用场景:适用于需要事务的支持,一致性要求较高,数据会频繁更新,高并发读写的业务场景
  • InnoDB支持事物,而MyISAM不支持事物。

  • InnoDB支持行级锁,而MyISAM支持表级锁。

  • InnoDB支持MVCC,而MyISAM不支持。

  • InnoDB支持外键,而MyISAM不支持。

  • InnoDB不支持全文索引,而MyISAM支持。

管理存储引擎

查看系统支持的存储引擎

##查看系统支持的存储引擎
show engines;

查看表使用的存储引擎

show table status from 库名 where name='表名'\G
show create table 表名;

修改存储引擎

通过alter table修改
use 库名;
alter table 表名 engine=MyISAM;

##修改已经存在的表
通过修改/etc/my.cnf 配置文件,指定默认存储引擎并重启服务
vim /etc/my.cnf
[mysqld]
default-storage-engine=INNODB

systemctl restart mysql.service
注意:此方法只对修改了配置文件并重启mysql服务后新创建的表有效,已经存在的表不会有变更。
通过create table 创建表时指定存储引擎
use 库名;
create table 表名 (字段1 数据类型,...) engine=MyISAM;

死锁

介绍

  • 死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方的资源,从而导致恶性循环的现象。

  • 常见的解决死锁的方法

    1. 如果不同程序会并发存取多个表,尽量约定以相同的顺序访问表,可以以大降低死锁机会。
    2. 在同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁产生概率;
    3. 对于非常容易产生死锁的业务部分,可以尝试使用升级锁定颗粒度,通过表级锁定来减少死锁产生的概率;
      如果业务处理不好可以用分布式事务锁或者使用乐观锁
  • 如何尽可能避免死锁?

    1. 使用更合理的业务逻辑,以固定的顺序访问表和行
    2. 大事务拆小。大事务更倾向于死锁,如果业务允许,将大事务拆小。
    3. 在同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁概率。
    4. 降低隔离级别。如果业务允许,将隔离级别调低也是较好的选择,比如将隔离级别从调整为RC,可以避免掉很多因为cap锁造成的死锁
    5. 为表添加合理的索引。如果不使用索引将会为表的每一行记录添加上锁,死锁的概率大大增大。
      可能做到一次锁定所需要的所有资源,减少死锁产生概率;

你可能感兴趣的:(8.mysql,mysql,数据库,java)