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;  #ROLLBACK

SET 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语句

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

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

相关文章

落地PC ,AI的“iPhone时刻”要来了?

在AI技术浪潮持续翻涌的背景下&#xff0c;近段时间&#xff0c;不断有声音强调“2024年将是AIPC元年”。 为了奔赴这一可以预见的未来&#xff0c;产业链上下游的企业也“干劲十足”。品牌商方面&#xff0c;2024年的国际消费电子展&#xff08;CES&#xff09;上&#xff0c…

贪吃蛇项目

引言&#xff1a; 本文章使用C语言在Windows环境的控制台中模拟实现经典小游戏贪吃蛇。 实现基本功能&#xff1a; 1.贪吃蛇地图绘制。 2.蛇吃食物的功能&#xff08;上、下、左、右方向键控制蛇的动作&#xff09; 3.蛇撞墙死亡 4.蛇咬到自己死亡 5.计算得分 6.蛇加速…

基于springboot原创歌曲分享平台源码和论文

随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理平台应运而生&#xff0c;各行各业相继进入信息管理时代&#xf…

Coppeliasim倒立摆demo

首先需要将使用Python远程控制的文件导入到文件夹&#xff0c;核心是深蓝色的三个文件。 本版本为4.70&#xff0c;其文件所在位置如下图所示&#xff0c;需要注意的是&#xff0c;目前不支持Ubuntu22的远程api&#xff1a; 双击Sphere这一行的灰色文件&#xff0c;可以看到远程…

UE5/UE4中3D汉字字体文字的创建与实现

本案例工程下载位置&#xff1a;https://mbd.pub/o/bread/ZZqVmJ9v 在虚幻引擎5&#xff08;UE5&#xff09;和虚幻引擎4&#xff08;UE4&#xff09;中&#xff0c;实现3D汉字字体的创建是一项常见的需求。 本文将详细介绍两种有效的方法&#xff1a; 1.通过TextRender配合Of…

Ubuntu系统安装 Redis

环境准备 Ubuntu 系统版本&#xff1a;22.04.3Redis 版本&#xff1a;6.2.12 检查本地 make 环境 make -version若没有安装&#xff0c;则需要安装 sudo apt install make检查本地 gcc 环境 gcc -version若没有安装&#xff0c;则需要安装 sudo apt install gcc。 sudo a…

第32关 k8s集群管理开源神器 - k9s

------> 课程视频同步分享在今日头条和B站 大家好&#xff0c;我是博哥爱运维。 随着我们管理维护的K8S集群上线&#xff0c;怎么管理好集群上面成百上千的服务pod&#xff0c;就是我们该操心的事情了。这里博哥把在生产中一直在用的一个开源管理工具k8s&#xff0c;github…

C++数据结构与算法——数组

C第二阶段——数据结构和算法&#xff0c;之前学过一点点数据结构&#xff0c;当时是基于Python来学习的&#xff0c;现在基于C查漏补缺&#xff0c;尤其是树的部分。这一部分计划一个月&#xff0c;主要利用代码随想录来学习&#xff0c;刷题使用力扣网站&#xff0c;不定时更…

Facebook的创新征程:社交媒体的演进之路

在当今数字化时代&#xff0c;社交媒体已经成为人们生活中不可或缺的一部分&#xff0c;而Facebook作为社交媒体领域的巨头&#xff0c;一直在不断创新和演进。本文将深入探讨Facebook的创新征程&#xff0c;追溯其社交媒体的发展历程&#xff0c;探讨其对用户、社会和数字时代…

hcip---ospf综合实验

一&#xff1a;实验要求 1、R4为ISP&#xff0c;其上只能配置IP地址&#xff0c;R4与其所有直连设备间均使用公有IP 2、R3-R5/6/7为MGRE环境&#xff0c;R3为中心站点 3、整个OSPF环境IP基于R4的环回 4、所有设备均可访问R4的环回 5、减少LSA的更新量&#xff0c;加快收敛…

基础算法(二)

一 高精度计算 int能表示范围为2^32&#xff0c;这看起来很大&#xff0c;但在大数据时代的如今&#xff0c;不说是int 哪怕是long long也是不够的&#xff0c;那么为了使用或计算这些超出或远超整形大小的数&#xff0c;我们这些数的计算方法称为高精度计算。 &#xff08;1)…

视频转GIF软件,轻松制作GIF动图

我们每天都会接触到大量的视频内容&#xff0c;从社交媒体到新闻网站&#xff0c;从电影到短视频。但你是否想过&#xff0c;如何将那些或是令人捧腹大笑或是让人感动至深的瞬间&#xff0c;轻松的保存下来随时回味&#xff1f;答案就是——将视频转为GIF动图。相较于传统的视频…

共享的IP隔一段时间就变?用这种方法可以不需要知道电脑IP

前言 一般来说,电脑接入路由器之后,IP是由路由器自动分配的(DHCP),但如果隔一段时间不开机连接路由器,或者更换了别的网卡进行连接,自动分配的IP就会更改。 比如你手机连接着电脑的共享IP:192.168.1.10,但过段时间之后,电脑的IP突然变成了192.168.1.11,那么你的所有…

假期刷题打卡--Day18

1、MT1168阶乘数 输入正整数N&#xff0c;找出它是否是一个等于其他数的阶乘值的数&#xff0c;输出YES或者NO。 格式 输入格式&#xff1a; 输入正整数N 输出格式&#xff1a; 输出YES或者NO 样例 1 输入&#xff1a; 5输出&#xff1a; NO 相关知识点 阶乘 可以理…

[Tcpdump] 网络抓包工具使用教程

往期回顾 海思 tcpdump 移植开发详解海思 tcpdump 移植开发详解 前言 上一节&#xff0c;我们已经讲解了在海思平台如何基于静态库生成 tcpdump 工具&#xff0c;本节将作为上一节的拓展内容。 一、tcpdump 简介 「 tcpdump 」是一款强大的网络抓包工具&#xff0c;它基于…

petalinux2022.2启动文件编译配置

安装必要运行库: sudo apt-get install iproute2 gawk python3 python sudo apt-get install build-essential gcc git make net-tools libncurses5-dev tftpd sudo apt-get install zlib1g-dev libssl-dev flex bison libselinux1 gnupg wget git-core diffstat sudo apt-ge…

Lucene 查询原理

Lucene 查询原理 - 知乎 前言 Lucene 是一个基于 Java 的全文信息检索工具包&#xff0c;目前主流的搜索系统Elasticsearch和solr都是基于lucene的索引和搜索能力进行。想要理解搜索系统的实现原理&#xff0c;就需要深入lucene这一层&#xff0c;看看lucene是如何存储需要检…

kafka集群搭建需要做的事情

首先&#xff0c;虚拟机克隆好之后的步骤如下&#xff1a; 1. 修改IP、主机名&#xff0c;关闭防火墙&#xff1b;&#xff08;reboot重启&#xff09; 2. 在/etc/hosts文件中进行IP与主机名的映射配置&#xff0c;集群中每天都记得配置&#xff1b; 3. 安装JDK并进行分发&a…

基于Matlab无刷直流电机系统仿真建模的新方法

摘 要&#xff1a;在分析无刷直流电机&#xff08;BLDC&#xff09;数学模型的基础上&#xff0c;提出了无刷直流电机系统仿真建模的 新方法。在Matlab/Simulink 中&#xff0c;建立独立的功能模块&#xff0c;如BLDC 本体模块、电流滞环控制模块、 速度控制模块等&#xff0c;…

漏洞原理文件上传漏洞

一 文件上传漏洞介绍&#xff08;理论&#xff09; 文件上传漏洞是一种常见的web应用程序漏洞&#xff0c;允许攻击者向服务器上传恶意文件。这种漏洞可在没有恰当的安全措施的情况下&#xff0c;将任意类型的文件上传到服务器上&#xff0c;从而可能导致以下安全问题&#xff…