MySQL(下)

四、事务

一、概念

       对数据库的一次执行中有多条sql语句执行。这多条sql在一次执行中,要么都成功执行,要么都不执行。保证了数据完整性。MySQL中只有innodb引擎支持事务。

二、特性       

        事务是必须满足 4 个条件(ACID):原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。
        原子性:一个事务中多条sql要么都执行,要么都不执行,不执行的回滚到事务执行前状态。
        隔离性:事务可以多个同时执行,要对多个事务进行隔离。
        持久性:事务正常提交后,可以保证数据持久保存,即使宕机也不丢失。
        一致性:原子性,持久性,隔离性都是为了保证一致性,保证数据是完整可靠的。

三、设置

        默认情况下, MySQL 启用自动提交模式(变量 autocommit 为 ON)。

MYSQL 事务处理主要有两种方法:

        1、用 BEGIN, ROLLBACK, COMMIT 来实现
                        BEGIN 开始一个事务
                        ROLLBACK 事务回滚
                        COMMIT 事务确认
        2、直接用 SET 来改变 MySQL 的自动提交模式:
                        SET GLOBAL / SESSION autocommit=0; 禁止自动提交
                        SET GLOBAL / SESSION autocommit=1;开启自动提交
查看 autocommit 模式
                SHOW GLOBAL / SESSION VARIABLES LIKE 'autocommit';

四、事务隔离级别

一、读未提交(read uncommitted):
        一个事务可以读取到另一个事务未提交的修改。这会带来脏读,幻读,不可重复读问题。
        
        SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
二、读已提交(read committed):
        一个事务只能读取另一个事务已经提交的修改。其避免了脏读,仍然存在不可以重复读和幻读问题。
        SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED
三、可重复读(repeatable read MySQL 默认隔离级别):
        同一个事务中多次读取相同的数据返回的是一样的。其避免了脏读和不可重复读问题,普通查询解决了幻读问题,如果在查询中添加 for update 语句, 会出现幻读问题.
幻读: 同一个事物中多次读取读到数据行数不同.
        SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
四、串行化(serializable):
        事务串行执行,避免了以上所有问题。
        SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE

五、事务实现原理     

        InnoDB 存储引擎还提供了两种事务日志:redolog(重做日志)和undolog(回滚日志)。其中 redolog 用于保证事务持久性;undolog 则是事务原子性和隔离性实现的基础。

原子性实现:

        MySQL用undolog 日志文件来记录增删改操作的反向操作。当出现异常事务回流时,执行对应操作的反向操作即可还原。

持久性实现(mysql 保证数据不丢失):

        当数据库事务提交后,保证数据是不能撤销的。当sql发送到MySQL后,事务还未提交前,如果发现断电或宕机,先将sql保存到redolog日志文件中,在MySQL更新启动时,执行redolog中sql.

六、隔离级别实现原理MVCC

MVCC是什么:

        MVCC(多版本并发控制 Multi-Version Concurrent Control),是 MySQL 提高性能的一种方式,配合 Undo log 和版本链,让不同事务的读-写、写-读操作同时进行提高并发访问,每次事务对某条记录操作时生成一个操作的版本链

        如果隔离是读已提交,那么在同一个事务中,每次读取时,都会从版本链上生成一个快照(read view),每次读到的时当前查询时最新的数据,也称当前读。

        如果事务隔离是可重复读,在事务第一次读取数据时,会从版本链上生成一个快照,之后再次读取时,仍从上次版本快照中读取,也可实现重复读,也称快照读。

五、锁机制

一、概述        

        事务在修改数据之前,需要先获得相应的锁;获得锁之后,事务便可以修改数据;该事务操作期间,这部分数据是锁定的,其他事务如果需要修改数据,需要等待当前事务提交或回滚后释放锁。

二、行锁、表锁、间隙锁

        行锁:

        一个事务对某行数据进行操作时,其他事务不能对本行进行操作。分为共享锁,排他锁。

        特点:粒度小,开销大,加锁慢,并发度高。

        表锁:

        表级锁操作时,会给整张表加锁,MYISAM 与 INNODB 都支持表级锁定。

        特点:锁定粒度最大,实现简单,资源消耗较少,开销小,加锁快,开发度最低。

        间隙锁:

        满足某条件,获取某区间。

三、共享锁、排他锁 

共享锁:

        又称读锁。为一个查询语句添加共享锁后,其他事务读取,但不能再添加排他锁。

排他锁:

        又称写锁。为一个查询语句添加排他锁后,其他事务就不能为加锁的数据添加其他锁了,共享锁也不可以。

六、SQL优化

一、为什么要优化 

        随业务数据量的增多,SQL 的执行效率对程序的运行效率的影响逐渐增大,此时对 SQL 的优化就很有必要。

二、优化方法   

1.查询 SQL 尽量不要使用 select *,而是具体字段
        节省资源、减少开销。
2.避免在 where 子句中使用 or 来连接条件
        反例:SELECT * FROM user WHERE id=1 OR salary=5000
        正例:使用 union all 把两个两个 SQL 结果合并
        使用 or 可能会使索引失效,从而全表扫描;对于or没有索引的salary这种情况,假设它走了id的索引,但是走到salary 查询条件时,它还得全表扫描;
3. 尽量使用数值替代字符串类型
        正例
                主键(id):primary key 优先使用数值类型 int
                性别(gender):0 代表女,1 代表男;数据库没有布尔类型,mysql
        推荐使用 tinyint
        因为引擎在处理查询和连接时会逐个比较字符串中每一个字符; 而对于数字型而言只需要比较一次就够了;字符会降低查询和连接的性能,并会增加存储开销;
4. 使用 varchar 代替 char
varchar 变长字段按数据内容实际长度存储,可以节省存储空间;
char 按声明大小存储,不足补空格;
其次对于查询来说,在一个相对较小的字段内搜索,效率更高;
5. 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by group by 涉及的列上建立索引
6. 应尽量避免索引失效
6.1 应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引
而进行全表扫描,如:select id from t where num=10 or num=20。
6.2 in 和 not in 也要慎用,否则会导致全表扫描,如:select id from t where num
in(1,2,3),对于连续的数值,能用 between 就不要用 in ,select id from t where
num between 1 and 3
6.3 模糊查询也将导致全表扫描
select id from t where name like '%abc%'
6.4 应尽量避免在 where 子句中对字段进行函数操作,这将导致引擎放弃使用索引而进
行全表扫描。如: select id from t where substring(name,1,3)='abc'
7. 提高 group by 语句的效率
反例:先分组,再过滤
正例:先过滤,后分组
8. 清空表时优先使用 truncate
truncate table 比 delete 速度快,且使用的系统和事务日志资源少.
delete 语句每次删除一行,并在事务日志中为所删除的每行记录一项。
truncate table 通过释放存储表数据所用的数据页来删除数据.
9. 表连接不宜太多,索引不宜太多,一般 5 个以内
        联的表个数越多,编译的时间和开销也就越大,每次关联内存中都生成一个临时表应该把连接表拆开成较小的几个执行,可读性更高。
10. 深度分页问题
        反例 :select id,name from account limit 100000,10;
        正例 :select id,name FROM account where id > 100000 order by id limit 10;
11. 使用 explain 分析 SQL 执行计划

三、执行计划

EXPLAIN
        使用EXPLAIN关键字可以模拟优化器执行SQL查询语句,从而知道MySQL
是如何处理SQL 语句的。
EXPLAIN 作用
        表的读取顺序
        数据读取操作的操作类型
        哪些索引可以使用
        哪些索引被实际使用
        表之间的引用
EXPLAIN 使用
        在 select 语句之前增加 explain 关键字,执行查询会返回执行计划的信息,
而不是执行 SQL。
例如:EXPLAIN SELECT * FROM USER WHERE id = 1
expain 出来的信息有 12 列,分别是:
id, select_type, table, type, possible_keys, key, key_len, ref, rows, Extra
其中:
id是选择标识符。是 SELECT 的查询序列号,id 如果相同,可以认为是一组,从上往下顺序执行,
在所有组中,id 值越大,优先级越高,越先执行。
select_type表示查询的类型。
        
        1.SIMPLE(简单 SELECT,不使用 UNION 或子查询等)
        2.PRIMARY(子查询中最外层查询,查询中若包含任何复杂的子部分,最外层的 select 被标记为 PRIMARY)
        3.SUBQUERY(子查询中的第一个 SELECT,结果不依赖于外部查询)
        4.DERIVED(派生表的 SELECT, FROM 子句的子查询)
        5.UNION(UNION 中的第二个或后面的 SELECT 语句)
table是输出结果集的表。
type表示表的连接类型。又称“访问类型”。常用的类型有:system>const>eq_ref>ref>range>index>ALL(从左到右,性能从好到差).
possible_keys表示查询时,可能使用的索引。显示可能应用在这张表中的索引,一个或多个。查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询实际使用。
system: 表只有一行记录(等于系统表),平时不会出现,这个也可以忽略不计。
const: 表示通过索引一次就找到了,const 用于比较 primary key 或者 unique索引。
eq_ref: 唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描.
ref: 非唯一性索引扫描,返回匹配某个单独值的所有行.本质上也是一种索引访问,它返回所有匹配某个单独值的行,但它可能会找到多个符合条件的行,所以他应该属于查找和扫描的混合体。
range: 只检索给定范围的行,使用一个索引来选择行。key 列显示使用了哪个索引一般就是在你的 where 语句中出现了 between、<、>、in 等的查询这种范围扫描索引扫描比全表扫描要好,因为它只需要开始于索引的某一点,而结束语另一点,不用扫描全部索引。
index: Full Index Scan,index 与 ALL 区别为 index 类型只遍历索引树。这通常比 ALL 快,因为索引文件通常比数据文件小。也就是说虽然 all 和 Index 都是读全表,但 index 是从索引中读取的,而 all 是从硬盘中读的)。
All: Full Table Scan,将遍历全表以找到匹配的行。一般来说,得保证查询至少达到 range 级别,最好能达到 ref.
key表示实际使用的索引。如果为 NULL,则没有使用索引,或者索引失效。
key_len是索引字段的长度。在不损失精确性的情况下,长度越短越好。
rows是扫描出的行数(估算的行数)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/348299.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【mongoDB】集合的创建和删除

目录 1.集合的创建 2. 查看所有集合 3.删除集合 1.集合的创建 格式&#xff1a; db.createCollection ( name ) 例如创建一个名为 bbb 的集合 还可以通过传递一个选项对象来指定集合的属性&#xff0c;例如最大文档的大小&#xff0c;索引选项等 例如 这样创建了一个名为 cc…

【业务功能篇133】 Mysql连接串优化性能问题

rewriteBatchedStatementstrue开启了MySQL驱动程序的批量处理功能。 spring.datasource.urljdbc:mysql://localhost:3306/mydatabase?rewriteBatchedStatementstrue 在MyBatis Plus框架中&#xff0c;批量插入是一种高效的数据库操作方式。通过开启rewriteBatchedStatementstr…

在优衣库新衣年货里,看见幸福感的“共振”

一场寒潮自北向南掠过&#xff0c;很多地区迎来瑞雪兆丰年的美好意象&#xff0c;年味渐浓&#xff0c;农历新年进入倒计时状态。带着对新年团聚的期许&#xff0c;置办年货&#xff0c;开始成为老百姓在这个时节的大事。 经历颇具魔幻色彩的2023年&#xff0c;“龙年”对中国…

x-cmd pkg | sqlite3 - 轻量级的嵌入式关系型数据库

目录 简介首次用户 技术特点竞品和相关产品sqlite 与 x-cmd进一步阅读 简介 sqlite3 是一个轻量级的文件数据库&#xff0c;体积非常小&#xff0c;提供简单优雅而功能强大的 sql 化的数据查询。 通常情况下&#xff0c;sqlite 指的是 SQLite 2.x 版本&#xff0c;而 sqlite3 …

Aleo测试网回顾-测试网期间共释放了多少积分

上一篇我们整理了Aleo的详细项目介绍&#xff0c;Aleo项目详细介绍-一个兼顾隐私和可编程性的隐私公链-CSDN博客 接下来&#xff0c;让我们盘点下测试网期间的积分释放情况&#xff0c;测试网期间的奖励积分也将是Aleo主网上线后的抛压来源。测试网期间共计释放了4000万的积分…

MATLAB标记点

% clear % clc % close all % % 生成随机时程信号 % fs100; % signalLength fs*60*2; % time 1/fs:1/fs:signalLength/fs; % randomSignal 2*sin(2*pi*0.5*time)3*cos(2*pi*1*time)randn(1, signalLength); function [frequencyPP]funct_peak(signal,Hz) % 生成随机时…

跨境防诈指南 | 了解美国电商持续遭遇的“超额支付”欺诈

目录 常见的“超额支付”欺诈类型 假支票诈骗 虚假信用卡欺诈 基于交易的洗钱诈骗 防止“超额支付”欺诈 增强交易安全保障 加强异常交易识别 借助反欺诈技术识别 加强团队欺诈培训 美国商业委员会的统计报告显示&#xff0c;2023年年1至6月&#xff0c;联邦贸易委员会&#xf…

kafka(三)生产问题

一、线上机器规划 二、线上问题优化 1、消息丢失的情况 消息发送端&#xff1a; a&#xff1a;acks0&#xff1a; 表示producer不需要等待broker确认收到消息的回复就可以继续发送消息&#xff1b;性能高&#xff0c;但很容易丢失消息&#xff1b; b&#xff1a;acks1&#x…

《游戏-01_3D-开发》之—人物动画控制器

创建变量&#xff0c; 创建线&#xff0c; 连接&#xff0c; 选中线会变为蓝色&#xff0c;新增变量&#xff0c; 设置线&#xff0c; 双击子层进入子层&#xff0c; 创建变量&#xff0c; 双击SkillPanel 拖拽好之后返回上一层&#xff0c; 依次连接&#xff0c; 设置线&#…

《WebKit 技术内幕》学习之十四(1):调式机制

第14章 调试机制 支持调试HTML、CSS和JavaScript代码是浏览器或者渲染引擎需要提供的一项非常重要的功能&#xff0c;这里包括两种调试类型&#xff1a;其一是功能&#xff0c;其二是性能。功能调试能够帮助HTML开发者使用单步调试等技术来查找代码中的问题&#xff0c;性能调…

03. 静态路由

文章目录 一. 静态路由概述1.1. 概述1.2. 路由信息获取方式1.3. 路由表的参数1.4. 路由协议的优先级1.5. 最优路由条目优先1.6. 最长前缀匹配原则 二. 实验实操2.1. 实验1&#xff1a;静态路由2.1.1. 实验目的2.1.2. 实验拓扑图2.1.3. 实验步骤&#xff08;1&#xff09;配置网…

centos系统安装Ward服务器监控工具

简介 Ward是一个简约美观多系统支持的服务器监控面板 安装 1.首先安装jdk yum install java-1.8.0-openjdk-devel.x86_64 2.下载jar wget 3.启动 java -jar ward-1.8.8.jar 体验 浏览器输入 http://192.168.168.110:4000/ 设置服务名设置为:myserver 端口号:5000 点击…

写一份简单的产品说明书:格式和排版建议

现在的市场竞争那么激烈&#xff0c;拥有一份简洁明了的产品说明书可以说是很重要的。产品说明书不仅向用户提供了对产品的详细了解&#xff0c;还能够树立品牌形象&#xff0c;提升用户体验。 | 一、写一份简单的产品说明书—一些建议 1.创意封面设计 一个吸引人的封面设计能…

wpf控件Expander集合下的像素滚动

项目场景&#xff1a;Expander集合滚动 如下图&#xff0c;有一个Expander集合&#xff0c;且设置 ScrollViewer.VerticalScrollBarVisibility "Auto" 每个Expaner下包含有若干元素&#xff0c;当打开Expader(即IsExpanded "true"&#xff09;时&#…

利用Python实现科学式占卜

一直以来,中式占卜都是基于算命先生手工实现,程序繁琐(往往需要沐浴、计算天时、静心等等流程)。准备工作复杂(通常需要铜钱等道具),计算方法复杂,需要纯手工计算二进制并转换为最终的卦象,为了解决这个问题,笔者基于python实现了一套科学算命工具,用于快速进行占卜…

测试人年终总结:入行三年,下一步怎么走,思想碰撞

原贴地址&#xff1a;入行三年&#xff0c;下一步怎么走&#xff0c;思想碰撞 TesterHome 熟悉环境&#xff0c;进步缓慢&#xff1b;停止思考&#xff0c;举步不前&#xff08;为什么会有这篇文章why 初心变质&#xff1a;计算机系毕业&#xff0c;毕业时的打算是从测试进&a…

MTP与管理壳(AAS)有异曲同工之妙

在过去的几年中&#xff0c;流程工业中的不同部门&#xff08;例如制药、精细化学品以及食品和饮料部门&#xff09;遇到了一系列共同且可比较的新兴挑战。这些挑战包括&#xff1a; 新产品的需求迅速接连不断&#xff0c;更快交货和更低价格的压力&#xff0c;更多定制产品&a…

有向图的拓扑序列——拓扑排序

问题描述 什么是拓扑序列 若一个由图中所有点构成的序列 A 满足&#xff1a;对于图中的每条边 (x,y)&#xff0c;x 在 A 中都出现在 y 之前&#xff0c;则称 A 是该图的一个拓扑序列。图中不能有环图中至少存在一个点的入度为0 如何求拓扑序列&#xff1f; 计算出每个节点的…

【Python编程工具】【ssh连接Docker容器】如何使用Docker容器里的python环境,如何调试在容器中的代码

文章目录 方案一览Gateway软件介绍启动容器配置apt源在容器中安装SSH服务器配置SSH服务器生成SSH密钥启动SSH服务为root创建密码连接到容器使用Gateway 方案一览 本篇博客将介绍如何在Docker容器中打开SSH连接服务&#xff0c;以及如何使用JetBrains Gateway软件进行代码调试。…