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是扫描出的行数(估算的行数)。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

江西公务员考试报名照如何上传成功

2024年江西省考报名公告已经发布了&#xff0c;想要参加江西省考报名的姐妹们&#xff0c;快来看看&#xff0c;提前了解报名流程&#xff0c;和报名照上传要求。 网上报名时间&#xff1a;1月28日9:00至2月2日17:00 网上缴费时间&#xff1a;1月28日9:00至2月3日17:00 打印准考…

备战蓝桥杯----数据结构及STL应用(基础2)

上次我们讲了vector的大致内容&#xff0c;接下来让我们讲一下栈&#xff0c;队列吧&#xff01; 什么是栈呢&#xff1f; 很简单&#xff0c;我们用的羽毛球桶就是&#xff0c;我们取的球&#xff0c;是最后放的&#xff0c;栈是一种先进后出的数据结构。 方法函数 s.push(…

SpringBoot深入解析:掌握自动装配机制及其定制化原理

推荐一款我一直在用的ChatGPT4.0国内站点&#xff0c;每日有免费使用额度&#xff0c;支持PC、APP、VScode插件同步使用 SpringBoot篇&#xff1a;SpringBoot的自动装配原理 SpringBoot是一个旨在简化Spring应用初始搭建以及开发过程的框架。它利用了Spring框架的依赖注入特性…

HDFS Federation前世今生

一 背景 熟悉大数据的人应该都知道&#xff0c;HDFS 是一个分布式文件系统&#xff0c;它是基于谷歌的GFS实现的开源系统&#xff0c;设计目的就是提供一个高度容错性和高吞吐量的海量数据存储解决方案。在经典的HDFS架构中有2个NameNode和多个DataNode&#xff0c;如下 从上面…

内网安全:RDP WinRS WinRM SPN Kerberos 横向移动

目录 WinRM协议 RDP协议 域横向移动&#xff1a;RDP协议 RDP协议利用 一. 探针服务 二. 获取NTML Hash 明文密码 三. 连接执行 域横向移动&#xff1a;WinRM WinRS WinRM协议、WinRS命令利用 一. cs 内置端口扫描5985 二. 连接执行 三. 上线CS 四. CS插件横向移动…

第五篇:express路由路径方式(字符串,字符串模式,和正则)

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 &#x1f4d8; 引言&#xff1a; &#x1f4…

(二十一)Flask之上下文管理第二篇(细细扣一遍源码)

每篇前言&#xff1a; &#x1f3c6;&#x1f3c6;作者介绍&#xff1a;【孤寒者】—CSDN全栈领域优质创作者、HDZ核心组成员、华为云享专家Python全栈领域博主、CSDN原力计划作者 &#x1f525;&#x1f525;本文已收录于Flask框架从入门到实战专栏&#xff1a;《Flask框架从入…

《幻兽帕鲁》1月29日游戏服务器推荐!腾讯云降低规格再次降价!

腾讯29日刷新规格&#xff0c;从14M降低到12M&#xff0c;硬盘和流量都有降低&#xff0c;但价格打下来了&#xff01;价格从66元/月降低到32元/月&#xff0c;277元/3个月降低到96元/3个月&#xff01; 三大厂商4核16G的云服务器价格对齐&#xff0c;不过具体参数略有不同 阿里…

C语言数据结构——链表

&#xff08;图像由AI生成&#xff09; 0.前言 在计算机科学中&#xff0c;数据结构是存储和组织数据的一种方式&#xff0c;它不仅影响数据的存储&#xff0c;也影响数据的检索和更新效率。C语言&#xff0c;作为一种经典的编程语言&#xff0c;提供了灵活的方式来处理数据…

GIS应用水平考试一级—2009 年度第二次

全国信息化工程师——GIS应用水平考试 2009 年度第二次全国统一考试一级 试卷说明: 1、本试卷共9页,6个大题,满分150 分,150 分钟完卷。 2、考试方式为闭卷考试。 3、将第一、二、三題的答案用铅笔涂写到(NCIE-GIS)答题卡上。 4、将第四、五、六题的答案填写到主观题答题卡上…

STM32学习笔记(二) —— 调试串口

我们在调试程序时&#xff0c;经常会使用串口打印相关的调试信息&#xff0c;但是单片机串口不能直接与 PC 端的 USB 接口通讯&#xff0c;需要用到一个USB转串口的芯片来充当翻译的角色。我们使用的开发板上有这个芯片&#xff0c;所以在打印调试信息的时候直接使用USB线连接开…

C#,广义斐波那契数(Generalised Fibonacci Numbers)的算法

广义斐波那契序列(generalized Fibonacci sequence)是斐波那契数的推广。由递推关系F₁F₂…Fm-10&#xff0c;Fₘ1&#xff0c;FmnFₙFn1…Fnm1&#xff0c;n≥1所产生的序列&#xff0c;称为m级广义斐波那契序列。 计算结果&#xff1a; 源代码&#xff1a; 1 文本格式 …

【MCAL】TC397+EB-tresos之GPT配置实战 - 定时器

本篇文章介绍了在TC397平台使用EB-tresos对GPT驱动模块进行配置的实战过程,不仅介绍了使用GTM来实现定时器的方案&#xff0c;还介绍了基于GPT12来实现连续定时器的实例。因为GTM是德国博世公司开发的IP&#xff0c;而英飞凌的芯片集成了这个IP&#xff0c;并在这个基础上搭建了…

蓝牙----蓝牙连接建立_连接建立

蓝牙----蓝牙连接建立_连接建立 蓝牙连接建立过程图1.主机扫描到广播包1.1判断是否是自己关心的广播包1.2广播地址添加到扫描列表 2.主机扫描结束&#xff0c;建立连接3.主从连接成功后&#xff0c;执行连接建立后事件3.1.主机将连接句柄和设备地址添加到连接列表3.2.主机进行G…

Docker 基础篇

目录 一、Docker 简介 1. Docker 2. Linux 容器 3. 传统虚拟机和容器的对比 4. Docker 的作用 5. Docker 的基本组成&#xff08;Docker 三要素&#xff09; 6. Docker 工作原理 7. Docker 架构 8. Docker 下载 二、Docker 安装 1. CentOS Docker 安装 2. CentOS8 …

贝锐蒲公英全新网页认证,保障企业访客无线网络安全

随着企业规模的不断扩大、人员的增长、无线终端数量/类型的增加&#xff0c;传统WiFi无线网络会暴露出越来越多的问题&#xff0c;导致无线网络管理困难。 比如&#xff1a;采用弱密码、安全防护不到位的默认设置、员工缺乏信息安全意识、未经授人员权访问无线网络…… 这些问…

SELINUX导致的网络服务问题解决

第一&#xff1a;开启相关服务&#xff0c;监控SELINUX 相关服务&#xff1a;setroubleshoot,auditd,大多数都是以se开头的 如果没有此服务&#xff0c;先yum下&#xff0c;然后查看状态 这里关于auditd说明&#xff0c;centos7不可以用systemctl重启auditd服务&#xff0c;…

深入了解Matplotlib中的子图创建方法

深入了解Matplotlib中的子图创建方法 一 add_axes( **kwargs):1.1 函数介绍1.2 示例一 创建第一张子图1.2 示例二 polar参数的运用1.3 示例三 创建多张子图 二 add_subplot(*args, **kwargs):2.1 函数介绍2.2 示例一 三 两种方法的区别3.1 参数形式3.2 布局灵活性3.3 适用场景3…

美化背景(拼图小游戏)

package Puzzlegame.com.wxj.ui;import javax.swing.*; import javax.swing.border.BevelBorder; import java.util.Random;public class GameJframe extends JFrame { //游戏主界面 //创建一个二维数组//目的&#xff1a;管理数据//加载图片的时候&#xff0c;会根据二维数组中…

ECRS软件:引领企业走向精益制造的未来

随着科技的快速发展和市场竞争的不断加剧&#xff0c;制造业正面临着前所未有的挑战和机遇。为了在激烈的市场竞争中立于不败之地&#xff0c;越来越多的企业开始寻求转型和升级&#xff0c;精益制造成为了一个备受关注的方向。而在这个过程中&#xff0c;ECRS软件以其独特的作…