(八)MySQL事务和SQL优化

事务(Transaction):

  1. 是数据库内最小且不可再分的单元。通常一个事务对应一个完整的业务(例如银行账户转账业务,该业务就是一个最小的工作单元)。
  2. 一个完整的业务由批量的DML语句(INSERT 、UPDATE、DELETE)共同联合完成。
  3. 事务只和DML语句有关,或者说DML语句才有事务。这个和业务逻辑有关,业务逻辑不同,DML语句的个数不同。
  4. 事务中的DML语句会全部执行或全都不执行,这是一个不可分割的工作单元。事务是由事务开始和事务结束之间所执行的数据库操作组成。

事务处理(事务操作):

保证所有事务都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式。当在一个事务中执行多个操作时,只有事务完成了提交行为,才意味着数据被永久的保存。要么数据库管理系统将放弃所有的修改。使整个事务回滚到最初状态。

#例如以银行转账需求:

家长账户   扣款    -money
学生账户   收款    +money

必要要求以上两台DML语句必须同时成功或者同时失败。最小单元不可再分,当第一条DML语句执行成功后,并不能将底层数据库中的第一个账户的数据修改,只是将操作进行了记录。这个记录是在内存中完成的,当第二条DML语句执行成功后,和底层数据库文件中的数据再进行完全的同步。反之如果第二条DML语句执行失败,清空所有的历史操作记录,以保证数据的统一。

事务的特征

事务的本质是由一组SQL语句组成的逻辑处理单元

  1. A (原子性Atomicity):原子性是指事务是一个不可分割的最小单元,事务中的操作要么都发生,要么都不发生。
  2. C (一致性Consistency):事务必须使数据库从一个一致性,转变到另一个一致性的状态。
  3. I (隔离性Isolation):多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他的事务操作所干扰,要求多个并发事务之间 要相互隔离
  4. D(持久性Durability):持久性指一个事务被提交是,它对于数据库内数据的改变就是永久性的,接下来即便数据库发生故障,也不应该对其有任何影响。

MySQL使用事务

实现:

1、手动关闭掉一个操作 >>>>>>> 自动提交改变成手动提交
SET AUTOCOMMIT = 0;

​2、标记事务的起点
START TRANSACTION

​3、编辑并执行 SQL语句 组

​4、提交
COMMIT

​5 、回滚(可选)
ROLLBACK

​6、手动开启掉一个操作 >>>>>>> 手动提交改变成自动提交
SET AUTOCOMMIT = 0;

MySQL 的开启事务,回滚,提交:

begin:5.5 以上版本 不需要手动begin,只要你执行的是一个DML,那么它就会自动在前面加入begin命令

COMMIT  提交事务:完成了一个事务,一旦事务提交成功,就说明具备了ACID原则

ROLLBACK  回滚职务:完成了一个事务,将内存中已执行的操作撤销,并还原成最初状态

事务的隔离级别

多个线程开启各自事务操作数据库中数据时,数据库系统要负责隔离操作,以保证各个线程在获取数据时的准确性。

如果不考虑隔离性:

  1. 幻读
  2. 脏读
  3. 不可重复读

1、幻读

在一个事务内读取到了别的事务插入的数据,导致前后读取的信息不一致

事务A按照自身的约定在进行数据读取,期间事务B插入了相同的搜索条件的新数据,事务A再次按照原先约定条件进行读取时,发现了事务B插入的新数据,幻读。

会造成事务中先产生的锁,无法管理后加入满足条件的行。

如何解决:

bin_log :产生数据一致性问题,在一个事务中,先对符合条件的目标行做变更,而在事务提交前,有新符合目标条件的加入。通过bin_log 恢复数据会将所有符合条件的目标行进行变更。

间隙锁:在两行记录间的空隙加上锁,防止新纪录的插入。

2、脏读

事务读取到另一个事务未提交的数据,解决方案 加入乐观锁。

3、不可重复读

不可重复读,是指在数据库访问中,一个事务范围内两个相同的查询却返回了不同数据

这是由于查询时系统中其他事务修改的提交而引起的。比如事务T1读取某一数据,事务T2读取并修改了该数据,T1为了对读取值进行检验而再次读取该数据,便得到了不同的结果。

幻读和不可重复读两者区别:

不可重复读 指同一条SQL查询到了不同的结果

幻读指 查询的结果行数不同

事务的隔离级别

描述脏读不可重复读幻读
Read uncommitted
Read committed
Repeatable read
Serializable

数据库优化

影响性能因素的优化

(1)服务优化

  1.    硬件
  2.    操作系统
  3.    网络
  4.    数据库设计

(2)应用优化

  1.     应用程序
  2.     查询
  3.     事务管理
  4.     数据分布

优化人员一般为数据库管理员、业务部门代表、架构师、应用程序设计开发人员、硬件及系统管理员、存储管理员等等...

系统优化

(1)软件优化:开发系统(操作系统)、MYSQL编译优化
(2)硬件优化:CPU、内存、硬盘、网卡

服务优化

Mysql配置

  1.     配置合理的Mysql服务器,尽量在应用本身达到一个合理的使用
  2.     针对于不同的搜索引擎,定制不同的配置
  3.     针对于不同的情况和需求,进行合理的配置
  4.     my.cnf进行配置

MyISAM配置项

选项缺省值推荐值说明
key_buffer_size8M128M--256M用来存放索引区块的缓存值, 建议128M以上,不要大于内存的30%
read_buffer_size128k10-20M用来做MyISAM表全表扫描的缓冲大小.
myisam_sort_buffer_size16M128M设置,恢复,修改表的时候使用的缓冲大小

InnoDB配置项

选项缺省值推荐值说明
innodb_buffer_pool_size32M1GInnoDB使用一个缓冲池来保存索引和原始数据, 这里你设置越大,你在存取表里面数据时所需要的磁盘I/O越少,一般是内存的一半,不超过2G,否则系统会崩溃,这个参数非常重要
innodb_additional_mem_pool_size2M128MInnoDB用来保存 metadata 信息,如果内存是4G,最好本值超过200M
innodb_flush_log_at_trx_commit100 代表日志只大约每秒写入日志文件并且日志文件刷新到磁盘; 1 为执行完没执行一条SQL马上commit; 2代表日志写入日志文件在每次提交后,但是日志文件只有大约每秒才会刷新到磁盘上. 对速度影响比较大,同时也关系数据完整性
innodb_log_file_size8M128M在日志组中每个日志文件的大小, 一般是innodb_buffer_pool_size的25%,官方推荐是innodb_buffer_pool_size 的 40-50%, 设置大一点来避免在日志文件覆写上不必要的缓冲池刷新行为
innodb_log_buffer_size128K8M用来缓冲日志数据的缓冲区的大小.推荐是8M,官方推荐该值小于16M,最好是 1M-8M 之间

应用优化

库表设计原则
  • 选择合适的数据类型:如果能够定长尽量定长
  • 使用 ENUM 而不是 VARCHAR,ENUM类型是非常快和紧凑的,在实际上,其保存的是 TINYINT,但其外表上显示为字符串。这样一来,用这个字段来做一些选项列表变得相当的完美 
  •     不要使用无法加索引的类型作为关键字段,比如 text类型
  •     为了避免联表查询,有时候可以适当的数据冗余,比如邮箱、姓名这些不容易更改的数据
  •     选择合适的表引擎,有时候 MyISAM 适合,有时候InnoDB适合
  •     为保证查询性能,最好每个表都建立有 auto_increment 字段, 建立合适的数据库索引
  •     最好给每个字段都设定 default 值
索引建立原则(一)

  •     一般针对数据分散的关键字进行建立索引,比如ID、QQ,•  
  •      像性别、状态值等等建立索引没有意义字段唯一,最少,不可为null
  •      对大数据量表建立聚集索引,避免更新操作带来的碎片。
  •      尽量使用短索引,一般对int、char/varchar、date/time 等类型的字段建立索引
  •      需要的时候建立联合索引,但是要注意查询SQL语句的编写
  •      谨慎建立 unique 类型的索引(唯一索引)
  •      大文本字段不建立为索引,如果要对大文本字段进行检索,
  •      可以考虑全文索引(引擎问题)频繁更新的列不适合建立索引    
索引建立原则(二)

  •     order by 字句中的字段,where 子句中字段,最常用的sql语句中字段,应建立索引。 
  •     唯一性约束,系统将默认为改字段建立索引。
  •     对于只是做查询用的数据库索引越多越好,但对于在线实时系统建议控制在5个以内。
  •     索引不仅能提高查询SQL性能,同时也可以提高带where字句的update,Delete SQL性能。
  •     Decimal 类型字段不要单独建立为索引,但覆盖索引可以包含这些字段。
  •     只有建立索引以后,表内的行才按照特地的顺序存储,按照需要可以是asc或desc方式。
  •     如果索引由多个字段组成将最用来查询过滤的字段放在前面可能会有更好的性能。
编写高效的 SQL (一)

  •     能够快速缩小结果集的 WHERE 条件写在前面,如果有恒量条件,也尽量放在前面
  •     尽量避免使用 GROUP BY、DISTINCT 、OR、IN 等语句的使用,避免使用联表查询和子查询,因为将使执行效率大大下降
  •     能够使用索引的字段尽量进行有效的合理排列,如果使用了联合索引,请注意提取字段的前后顺序
  •     针对索引字段使用 >, >=, =, <, <=, IF NULL和BETWEEN 将会使用索引,
  •     如果对某个索引字段进行 LIKE 查询,使用 LIKE  ‘%abc%’不能使用索引,使用 LIKE ‘abc%’
  •     将能够使用索引    如果在SQL里使用了MySQL部分自带函数,索引将失效,
  •     同时将无法使用 MySQL 的 Query Cache,
  •     比如 LEFT(), SUBSTR(), TO_DAYS(),DATE_FORMAT(), 等,
  •     如果使用了 OR 或 IN,索引也将失效
  •     使用 Explain 语句来帮助改进我们的SQL语句
编写高效的 SQL (二)

  •     不要在where 子句中的“=”左边进行算术或表达式运算,否则系统将可能无法正确使用索引
  •     尽量不要在where条件中使用函数,否则将不能使用索引
  •     避免使用 select *, 只取需要的字段
  •     对于大数据量的查询,尽量避免在SQL语句中使用order by 字句,避免额外的开销
  •     如果插入的数据量很大,用select into 替代 insert into 能带来更好的性能
  •     采用连接操作,避免过多的子查询,产生的CPU和IO开销
  •     只关心需要的表和满足条件的数据
  •     适当使用临时表或表变量
  •     对于连续的数值,使用between代替in
  •     where 字句中尽量不要使用CASE条件
  •     尽量不用触发器,特别是在大数据表上
  •     更新触发器如果不是所有情况下都需要触发,应根据业务需要加上必要判断条件   
  •     使用union all 操作代替OR操作,注意此时需要注意一点查询条件可以使用聚集索引,
  •     如果是非聚集索引将起到相反的结果
  •     当只要一行数据时使用 LIMIT 1
  •     尽可能的使用 NOT NULL填充数据库
  •     拆分大的 DELETE 或 INSERT 语句
  •     批量提交SQL语句

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

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

相关文章

pinctrl子系统与gpio子系统实验-通过应用程序测试Led驱动程序

一. 简介 前面几篇文章基本完成了 Led驱动代码&#xff0c;前面通过加载驱动模块也测试了 驱动程序。 这里通过运行应用程序&#xff0c;通过应用程序调用 Led驱动程序&#xff0c;从而驱动 打开或者关闭 Led灯。 二. 通过应用程序测试Led驱动程序 1. 驱动代码实现 gpiole…

【Qt】—— 项⽬⽂件解析

目录 &#xff08;一&#xff09;.pro⽂件解析 &#xff08;二&#xff09;widget.h⽂件解析 &#xff08;三&#xff09;main.cpp⽂件解析 &#xff08;四&#xff09;widget.cpp⽂件解析 &#xff08;五&#xff09;widget.ui⽂件解析 &#xff08;一&#xff09;.pro⽂…

Sg5032can(晶体振荡器spxo)规格书

SG5032CAN是爱普生推出的一款小体积尺寸5.0x3.2mm石英晶体振蒎器&#xff0c;四脚贴片晶振&#xff0c;输出频率范围为4MHz~72MHz,电源电压1.8V ~ 3.3V&#xff0c;支持CMOS输出&#xff0c;具有超小型&#xff0c;轻薄型&#xff0c;高精度&#xff0c;高性能&#xff0c;高品…

(二)hadoop搭建

1. 下载 访问https://hadoop.apache.org/releases.html查看hadoop最新下载地址 wget https://dlcdn.apache.org/hadoop/common/hadoop-3.3.4/hadoop-3.3.4.tar.gz 2.解压 tar zxvf hadoop-3.3.4.tar.gz mv hadoop-3.3.4 /usr/local 3.配置环境变量&#xff08;新建.sh文件&…

【网站项目】066农家乐信息平台

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

面向对象(基础)---面向对象编程概述、Java语言的基本元素:类和对象

学习面向对象内容的三条主线&#xff1a; ①Java类及类的成员&#xff1a;&#xff08;重点&#xff09;属性、方法、构造器&#xff1b;&#xff08;熟悉&#xff09;代码块、内部类 ②面向对象的特征&#xff1a;封装、继承、多态、&#xff08;抽象&#xff09; ③其他关…

stm32--simulink开发之--timer的学习,硬件输入中断,触发事件,STM32通用定时器之输出比较模式与PWM模式(重要理解)

下面三个模块&#xff0c;一个比一个高级&#xff0c;当然使用是越来越简单 STM32F4xx系列控制器有2个高级控制定时器、10个通用定时器和2个基本定时器(推荐学习) 1&#xff0c;第一个模块&#xff1a;Timer 浅层理解&#xff1a;计数&#xff0c;不停的触发 Starts timer co…

Servlet简述

Servlet是动态web资源开发技术&#xff0c;其实就是一个接口&#xff0c;将来定义Servlet实现类时&#xff0c;都必须实现该接口&#xff0c;并让web服务器运行Servlet 1.快速入门 使用注释配置访问路径在Servlet3.0之后应用&#xff0c;在此之前都是使用xml配置文件来配置的。…

零基础怎么学鸿蒙开发?

对于零基础的学习者来说&#xff0c;掌握鸿蒙开发不仅是迈向新技术的第一步&#xff0c;更是开拓职业道路的重要机遇。随着鸿蒙系统在各行各业的应用逐渐扩展&#xff0c;对于掌握这一项技术的开发人员需求也随之增长。下文将为大家提供针对零基础学习鸿蒙开发的逻辑&#xff0…

粒子群优化算法

PSO算法 粒子群算法&#xff08;Particle,Swarm Optimization,PSO&#xff09;由Kennedy和Eberhart于1995年提出&#xff0c;算法模仿鸟群觅食行为对优化问题进行求解。 粒子群算法中每个粒子包含位置和速度两个属性&#xff0c;其中&#xff0c;位置代表了待求问题的一个候选…

2024年最强网络安全学习路线,详细到直接上清华的教材!

关键词&#xff1a;网络安全入门、渗透测试学习、零基础学安全、网络安全学习路线 首先咱们聊聊&#xff0c;学习网络安全方向通常会有哪些问题 前排提示&#xff1a;文末有CSDN官方认证Python入门资料包&#xff01; 1、打基础时间太长 学基础花费很长时间&#xff0c;光语言…

mysql 慢查询调优实战

目录 异常现象&#xff1a;进行复现&#xff1a;寻找原因&#xff1a;解决办法&#xff1a;办法一&#xff1a;指定执行索引办法二&#xff1a;先按二级索引里字段排序&#xff0c;再按id排序办法三&#xff1a;取消排序 最终方案&#xff1a;复盘&#xff1a; 异常现象&#x…

基于springboot+vue的校园赛事资讯网站(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

搜维尔科技:【简报】元宇宙数字人赛道,优秀作品《星云时报》赏析

AI 对人们来说是一种新产业&#xff0c;而人们对于它未来会面临的议题仍有许多疑虑&#xff0c;因此我们用新闻报导的方式列举一些有趣且具有可能性的标题&#xff0c;希望能让 大家了解 AI 在未来可能会带来什么问题&#xff0c;以及我们应该采取的态度。 学校&#xff1a; 新…

C++(17)——list的模拟实现

前面的文章中&#xff0c;介绍了&#xff0c;的模拟实现&#xff0c;本篇文章将介绍对于的模拟实现。 目录 1. list的基本结构&#xff1a; 2. list功能实现&#xff1a;尾部插入元素&#xff1a; 3. list迭代器的实现&#xff1a; 4. list功能实现&#xff1a;在任意位置前…

vue2 导入使用vue-codemirror详解

目录 vue2 导入使用vue-codemirror详解1 介绍2 安装使用2.1 安装 vue-codemirror2.2 使用 codemirror2.2.1 引入 3 配置详情3.1 语言模式配置3.2 自动高度设置3.4 主题配置 4 总结 vue2 导入使用vue-codemirror详解 1 介绍 vue-codemirror是一个基于Vue的代码在线编辑器组件&…

【jenkins】主从机制及添加Slave节点操作

一、master-slave 日常构建Jenkins任务中&#xff0c;会经常出现下面的情况&#xff1a; 自动化测试需要消耗大量的 CPU 和内存资源&#xff0c;如果服务器上还有其他的服务&#xff0c;可能会造成卡顿或者宕机这样的情况&#xff1b; Jenkins 平台上除了这个项目&#xff0c…

把成绩私发给家长

与家长保持及时、有效的沟通对于学生的成长至关重要。但有时候&#xff0c;我会选择将学生的成绩私发给家长&#xff0c;而不是在公共场合公布。这样做有以下几个原因。 保护学生的隐私。每个学生都拥有自己的个人信息&#xff0c;这包括学习成绩。在公共场合公布成绩&#xf…

Sqoop数据迁移工具

概述 Apache Sqoop&#xff08;SQL-to-Hadoop&#xff09;项目旨在协助RDBMS与Hadoop之间进行高效的大数据交流。用户可以在 Sqoop 的帮助下&#xff0c;轻松地把关系型数据库的数据导入到 Hadoop 与其相关的系统 (如HBase和Hive)中&#xff1b;同时也可以把数据从 Hadoop 系统…

【计算机二级考试C语言】C递归

目录 C 递归 数的阶乘 实例 斐波那契数列 实例 C 递归 递归指的是在函数的定义中使用函数自身的方法。 举个例子&#xff1a; 从前有座山&#xff0c;山里有座庙&#xff0c;庙里有个老和尚&#xff0c;正在给小和尚讲故事呢&#xff01;故事是什么呢&#xff1f;"从…
最新文章