MySQL事务和SQL优化

目录

1 什么是事务

2 事务的特征

3 MySQL使用事务

实现

示例

4 事务的隔离级别

幻读

解决方法

脏读

不可重复读

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

事物的隔离级别

5 数据库优化

5.1 影响性能因素的优化

        服务优化

        应用优化

5.2 谁参与优化

5.3 系统优化

        软件优化

        硬件优化

5.4 服务优化

        MySQL配置

5.5 MyISAM 配置项

5.6 InnoDB 配置项

5.7 应用优化

库表设计原则

索引建立原则(一)

索引建立原则(二)

编写高效的SQL(一)

编写高效的SQL(二)


1 什么是事务

        Transaction,使我们数据库内最小且不可再分的单元

        通常一个事务对应一个完整的业务(例如银行账户转账业务,该业务就是一个最小的工作单元)

        一个完整的业务需要批量的DML(INSERT 、UPDATE、DELETE)语句共同联合完成。事务只和DML语句有关,或者说DML语句才有事务。这个和业务逻辑有关,业务逻辑不同,DML语句的个数不同。

        操作序列范畴,这些序列共有的一个特征 要么全部执行,要么全都不执行。这是一个不可分割的工作单元。事务是由事务开始和事务结束之间所执行的数据库操作组成

#例如:银行转账需求:

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

        必要要求 以上两台DML语句必须同时成功或者同时失败

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

        事务处理(事务操作):

                保证所有事务都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式。当在一个事务中执行多个操作时,只有事务完成了提交行为。才意味着数据被永久的保存。

                要么数据库管理系统将放弃所有的修改。使整个事务回滚到最初状态

2 事务的特征

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

3 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  回滚职务
完成了一个事务,将内存中已执行的操作撤销,并还原成最初状态

示例

#需求  顾客A在线购买了一个商品 价格XXXX元 采用转账方式进行支付
#假设A 存款金额XXXX元,且向卖家B支付购买商品费用
#卖家B 当前账户余额XXXX元#步骤1:创建数据库 shop_db;
CREATE DATABASE shop_db;
#步骤2:创建账户表  账户编号(自增)  账户人   当前账户金额
CREATE TABLE IF NOT EXISTS  `account` (`id` int(11) not null auto_increment,`name` varchar(32) not null,`cash` decimal(9,2) not null,PRIMARY KEY (`id`)
) ENGINE=InnoDB;
#步骤3:通过事务完成转账业务
SET AUTOCOMMIT = 0;START TRANSACTION;
UPDATE account set cash = cash - 1000 WHERE name = 'A';
UPDATE account set cash = cash + 1000 WHERE name = 'B';COMMIT;  #ROLLBACKSET AUTOCOMMIT = 1;

4 事务的隔离级别

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

        如果不考虑隔离性:

                1、幻读

                2、脏读

                3、不可重复读

幻读

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

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

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

解决方法

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

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

脏读

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

不可重复读

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

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

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

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

事物的隔离级别

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

5 数据库优化

5.1 影响性能因素的优化

        服务优化

                硬件、操作系统、网络、数据库设计

        应用优化

                应用程序、查询、事物管理、数据分布

5.2 谁参与优化

        数据库管理人员、业务部门代表、架构师、应用程序设计开发人员、硬件及系统管理人员......

5.3 系统优化

        软件优化

                开发系统(操作系统)、MySQL编译优化

        硬件优化

                CPU、内存、硬盘、网卡

5.4 服务优化

        MySQL配置

                配置合理的MySQL服务器,尽量在应用本身达到一个合理的使用

                针对于不同的搜索引擎,定制不同的配置

                针对于不同的情况和需求,进行合理的配置

                my.cnf 进行配置

5.5 MyISAM 配置项

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

5.6 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 之间

5.7 应用优化

库表设计原则

        选择合适的数据类型:如果能够定长尽量定长

        使用 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.mzph.cn/news/658334.shtml

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

相关文章

人力RPO蓝海项目可靠性有多大?

随着全球经济的快速发展&#xff0c;人力资源外包服务逐渐成为企业降低成本、提高效率的重要手段。其中&#xff0c;RPO(招聘流程外包)作为人力资源外包的一种形式&#xff0c;日益受到企业的青睐。然而&#xff0c;对于RPO的可靠性&#xff0c;业界和学界存在不同的看法。本文…

宏景eHR FrCodeAddTreeServlet SQL注入漏洞复现

前言 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。 一、产…

mybatisplus-多数据源配置

1. 流程 pom文件yml配置多数据源具体服务添加注解DS(“***”) 1.pom文件 <!--mybatis plus 起步依赖--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.0</vers…

万户 ezOFFICE DocumentEditExcel.jsp SQL注入漏洞

0x01 产品简介 万户OA ezoffice是万户网络协同办公产品多年来一直将主要精力致力于中高端市场的一款OA协同办公软件产品,统一的基础管理平台,实现用户数据统一管理、权限统一分配、身份统一认证。统一规划门户网站群和协同办公平台,将外网信息维护、客户服务、互动交流和日…

STM32F407移植OpenHarmony笔记6

继上一篇笔记&#xff0c;编译好STM32的裸机程序&#xff0c;能点亮LED灯了。 下一步就是启动liteos_m内核了。 不过为了更好的调试代码&#xff0c;需要先把printf重定向到串口&#xff0c;基于gcc的printf重定向和Keil不一样。 直接新建printf.c&#xff0c;在里面重写printf…

笔记本从零安装ubuntu server系统+环境配置

文章目录 前言相关链接ubuntu Server 安装教程屏幕自动息屏关上盖子不休眠MobaXterm外网SSH内网穿透IPV6远程 为什么我要笔记本装Linux为什么要换ubuntu Server版能否连接wifi之后Linux 配置清单总结 前言 之前装了个ubuntu desktop 版&#xff0c;发现没有命令行&#xff0c;…

呼吸灯--FPGA

目录 1.breath_led.v 2.tb_breath_led.v 呼吸灯就是从完全熄灭到完全点亮&#xff0c;再从完全点亮到完全熄灭。具体就是通过控制PWM的占空比控制亮灭程度。 绘制PWM波的步骤就是&#xff0c;首先灯是在第一个时钟周期保持高电平熄灭状态&#xff0c;在第二个时钟周期保持1/1…

RabbitMQ入门概念

目录 一、RabbitMQ入门 1.1 rabbitmq是啥&#xff1f; 1.2 应用场景 1.3 AMQP协议与RabbitMQ工作流程 1.4 Docker安装部署RabbitMQ 二、SpringBoot连接MQ配置 2.1 示例1 2.1 示例2 —— 发送实体 一、RabbitMQ入门 1.1 rabbitmq是啥&#xff1f; MQ&#xff08;Message…

ArcGIS Pro字段编号相关代码

字段属于SHP文件的重要组成部分&#xff0c;在某些时候需要对字段进行编号&#xff0c;这里为大家介绍一下字段编号相关的代码&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的POI数据&#xff0c;除了POI数据&#xff0c;常见的GIS数据都可…

C语言第十四弹---函数递归

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 函数递归 1、递归是什么&#xff1f; 1.1、递归的思想&#xff1a; 1.2、递归的限制条件 2、递归举例 2.1、举例1&#xff1a;求n的阶乘 2.1.1、分析和代码…

Transformer 代码补充

本文是对Transformer - Attention is all you need 论文阅读-CSDN博客以及【李宏毅机器学习】Transformer 内容补充-CSDN博客的补充&#xff0c;是对相关代码的理解。 先说个题外话&#xff0c;在之前李宏毅老师的课程中提到multi-head attention是把得到的qkv分别乘上不同的矩…

【Java】Lombok的使用

一、Lombok是什么&#xff1f; Lombok是一个Java库&#xff0c;能自动插入编辑器并构建工具&#xff0c;简化Java开发。通过添加注解的方式&#xff0c;不需要为类编写getter或eques方法&#xff0c;同时可以自动化日志变量&#x1f680; 在我们封装一个类时&#xff0c;最常用…

CUDA编程- - GPU线程的理解 thread,block,grid - 学习记录

GPU线程的理解 thread,block,grid 一、从 cpu 多线程角度理解 gpu 多线程1、cpu 多线程并行加速2、gpu多线程并行加速2.1、cpu 线程与 gpu 线程的理解&#xff08;核函数&#xff09;2.1.1 、第一步&#xff1a;编写核函数2.1.2、第二步&#xff1a;调用核函数&#xff08;使用…

网络代理用途

网络代理的用途广泛&#xff0c;常用于代理爬虫&#xff0c;代理VPN &#xff0c;代理注入等。使用网络 代理能够将入侵痕迹进一步减少&#xff0c;能够突破自身IP的访问限制&#xff0c;提高访问速度&#xff0c; 以及隐藏真实IP &#xff0c;还能起到一定的防止攻击的作用。下…

ROS方向第二次汇报(2)

文章目录 1.本方向内学习内容&#xff1a;1.1.动作&#xff1a;1.1.1.案例接口定义:1.1.2.案例通信模型&#xff1a;1.1.3.服务器端代码&#xff1a;1.1.4.客户端源代码&#xff1a;1.1.5.动作命令行操作&#xff1a; 1.2.参数&#xff1a;1.2.1.查看参数列表&#xff1a;1.2.2…

dvwa靶场xss储存型

xss储存型 xxs储存型lowmessage框插入恶意代码name栏插入恶意代码 medium绕过方法 high xxs储存型 攻击者事先将恶意代码上传或储存到漏洞服务器中&#xff0c;只要受害者浏览包含此恶意代码的页面就会执行恶意代码。产生层面:后端漏洞特征:持久性的、前端执行、储存在后端数据…

4JS表达式和运算符expression and operator

表达式&#xff08;expression&#xff09;JavaScript中的一个短语&#xff0c;JavaScript解释器会将其计算&#xff08;evaluate&#xff09;出一个结果。程序中的常量是最简单的一类表达式。变量名也是一种简单的表达式&#xff0c;它的值就是赋值给变量的值。复杂表达式是由…

类与对象(中篇)

1、类的6个默认成员函数 如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。 默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。 2、构造函数---初始…

Java技术栈 —— Spring MVC 与 Spring Boot

参考文章或视频链接[1] Spring vs. Spring Boot vs. Spring MVC[2] Key Differences Between Spring vs Spring Boot vs Spring MVC

CRM系统主要干什么的

阅读本文&#xff0c;你将了解&#xff1a;一、CRM系统是什么&#xff1b;二、CRM系统主要干什么的&#xff1b;三、CRM系统在企业管理中的重要作用&#xff1b;四、企业落地案例分享——大吉包装。 本文所提及的功能演示和图片内容均来自于我们公司正在使用的简道云CRM系统&a…