Mysql中的隐式COMMIT以及Savepoints的作用以及MySQL的Innodb分空间存储、设计优化、索引等几个小知识点整理

news2024/11/24 17:20:26

一、Mysql中的隐式COMMIT以及Savepoints的作用

    Mysql默认是自动提交的,如果要开启使用事务,首先要关闭自动提交后START TRANSACTION 或者 BEGIN 来开始一个事务,使用ROLLBACK/COMMIT来结束一个事务。但即使如此,也并不是所有的操作都能被ROLLBACK,以下语句在执行后会导致回滚失效,比如DDL语句创建一个数据库,而且不止此,这样的语句包括以下这些等:

ALTER FUNCTION, ALTER PROCEDURE, ALTER TABLE, BEGIN, CREATE DATABASE, CREATE FUNCTION, CREATE INDEX, CREATE PROCEDURE, CREATE TABLE, DROP DATABASE, DROP FUNCTION, DROP INDEX, DROP PROCEDURE, DROP TABLE, LOAD MASTER DATA, LOCK TABLES, RENAME TABLE, SET AUTOCOMMIT=1, START TRANSACTION, TRUNCATE TABLE, UNLOCK TABLES,CREATE TABLE, CREATE DATABASE DROP DATABASE, TRUNCATE TABLE, ALTER FUNCTION, ALTER PROCEDURE, CREATE FUNCTION, CREATE PROCEDURE, DROP FUNCTION和DROP PROCEDURE...

    这些语句(以及同义词)均隐含地结束一个事务,即在执行本语句前,它已经隐式进行了一个COMMIT。InnoDB中的CREATE TABLE语句被作为一个单一事务进行处理。所以ROLLBACK不会撤销用户在事务处理过程中操作的CREATE TABLE语句。另外上面的语句中包括START TRANSACTION,这即是说明事务不能被嵌套。事物嵌套会隐式进行COMMIT,即一个事务开始前即会把前面的事务默认进行提交。

    在这个页面 https://blog.csdn.net/qingsong3333/article/details/77018567 上看到这个例子,如下图:

        看图上说:是因为CREATE语句已经隐式地commit了。之后的语句都是自动提交的。我就感觉这里有问题,自己试了一下,果真是有问题,如下命令:

#执行SQL命令
set autocommit=0;
start transaction;
	create table teachers(id int  AUTO_INCREMENT, tname varchar(50), PRIMARY KEY (id) ); 
	INSERT INTO students(username) VALUES('lisi');
rollback;

#执行结果:
[SQL]set autocommit=0;
受影响的行: 0
时间: 0.001s
[SQL]
start transaction;
受影响的行: 0
时间: 0.000s
[SQL]
	create table teachers(id int  AUTO_INCREMENT, tname varchar(50), PRIMARY KEY (id) );
受影响的行: 0
时间: 0.171s
[SQL] 
	INSERT INTO students(username) VALUES('lisi');
受影响的行: 1
时间: 0.001s
[SQL]
rollback;
受影响的行: 0
时间: 0.126s

     上面的在执行过程中,ROLLBACK虽然不能撤回create table语句,但是数据插入行是会回滚的(表students数据未增加,但自增字段会增加1)。真不知道它的结论是怎么来的,误导人啊,真捉急!!真捉急!!

#. 总结:

        总之关于START TRANSACTION 和autocommit,

1.不管autocommit 是1还是0,START TRANSACTION 后,只有当commit数据才会生效,ROLLBACK后就会回滚(不能回滚的DDL语句等除外)。
2.当autocommit 为 0 时,不管有没有START TRANSACTION。只有当commit数据才会生效,ROLLBACK后就会回滚。
3.如果autocommit 为1,并且没有START TRANSACTION。调用ROLLBACK是没有用的。即便设置了SAVEPOINT。

        上面谈到了设置SAVEPOINT, savepoint正如其字面意思,保存点,在事务中可以设定保存点,回滚的时候可以自由定义回滚至某个保存点,而不用一定要回滚到事务开始的时候的数据状态,官方介绍:保存点(savepoint)是事务过程中的一个逻辑点,用于取消部分事务,当结束事务时,会自动的删除该事务中所定义的所有保存点。当执行rollback时,通过指定保存点可以回退到指定的点。如下示例一看便懂。

set autocommit = 0;
start transaction;
	INSERT INTO students(username) VALUES('haha');
	SAVEPOINT tempa;
	INSERT INTO students(username) VALUES('haha_2');
	ROLLBACK TO SAVEPOINT tempa;
    #此处使用不使用RELEASE都可以,会自动删除
	RELEASE SAVEPOINT tempa;
COMMIT;

二、MySQL的Innodb分空间存储、设计优化、索引等几个小知识点记一下

备注:迁移时发现第二篇文章中可能有一些从其它文章中复制过来的成分,如作者认为侵权,请联系我删除。

1, mysql使用Innodb存储引擎时的存储优化

在mysql5.5及之上,Innodb是默认的存储引擎,也是MySQL推荐使用的存储引擎。其提供事务,行级锁定,外键约束的存储引擎,是一个事务安全型存储引擎,更加注重数据的完整性和安全性。但Innodb存储引擎默认是所有的innodb表的表空间文件都在同一个空间中,如ibdata文件(myisam数据索引分别存储于不同的文件中),这不利于数据存储\维护、迁移。可以通过配置innodb_file_per_table项,达到每张innodb表的数据和索引放在一个独立表空间文件里。
#默认为0,存放在一个文件中

> set global innodb_file_per_table =0;

#独立存放

> set global innodb_file_per_table =1;

2, Innodb和Myisam存储顺序区别

        关于Innodb存储引擎和Myisam引擎的一个插入的数据存储顺序区别。Innodb存储引擎插入的数据会按照主键顺序存储,即在插入的时候会做排序工作,所以插入效率较低。而Myisam存储方式,数据的存储顺序为插入顺序,不会去排序,便利插入速度极快,空间占用量小。在多年前我曾经做过一个开发工作,要将一大堆的数据连续插入数据库中,并且业务需求中这些数据是原始存储数据,不用再进行修改,当时被推荐使用Innodb引擎,但是在使用的时候我感觉插入速度很慢,特别是在数据量大了之后感觉越来越慢,之后我换成了Myisam引擎,插入效率极快。从这里也就能找到答案了。总之对于那些只是数据插入查询而很少进行数据更新删除的表,使用MYISAM引擎很合适。如果完全是不用更新删除的数据,可考虑使用Archive存档型存储引擎,其仅提供插入和查询操作。可非常高效地实现无阻塞的插入和查询。

3, Mysql数据库设计优化的几个小点

A,占用存储空间尽可能小,
    能用Tinyint不要用smallint,能用mediumint不要用int;字符串设计成varchar时尽量使用小N:Varchar(N);日期格式使用Datetime, timestamp。
B,占用存储空间尽可能固定定长
    Char,varchar,Decimal(变长), double(float)(定长)
C,尽可能使用整数:IPV4, int unsigned, varchar(15),Enum,Set
D,多使用位运算。

4, 复习一下数据库设计要满足的3个范式和逆规范化

范式:Normal format,是一种离散数学中都知识,是为了解决一种数据的存储与优化的问题,保证数据的存储之后,凡是能够通过关系寻找出来的数据,坚决不再重复存储,其终极目标是为了减少数据的冗余。

1NF:第一范式:字段原子性
        在设计表存储数据的时候,如果表中设计的字段存储的数据,在取出来使用之前,还需要额外的处理(拆分),那么说表的设计不满足第一范式,第一范式要求字段的数据具有原子性:不可再分。比如将商品的长宽高用逗号连接放在一个字段里,取出来时又要切开,则不符合第一范式。

2NF:第二范式:不允许出现部分依赖。
        数据表设计中如果有复合主键(多字段主键),而表中有字段并不是由整个主键来确定,而是依赖主键中的某个字段,称为部分依赖。第二范式就是不允许出现部分依赖。比如有两张表学生表和课程表,另外一张学生选课表中会有学生的名称或ID,但是学生课程表中再出现学生的性别的话,就出现了部分依赖。

在2NF的基础上的3NF:第三范式:无传递依赖
        理论上讲,应该一张表中的所有字段都应该直接依赖主键(逻辑主键:代表的是业务主键。无传递依赖),如果表设计中存在一个字段,并非直接依赖主键,而是通过某个非主键字段依赖,最终实现依赖主键,把这种不是直接依赖主键,而是依赖非主键字段的依赖关系称之为传递依赖。在上面的2NF的问题中,解决方法除了拆表外,还能添加取消复合主键,使用逻辑主键(比如自增ID)来实现满足2NF,但是这样的后果就是出现传递依赖,即学生性别依赖学生,学生依赖主键。

        逆规范化:有时候,在设计表的时候,如果一张表中有几个字段是需要从另外的表中去获取信息,理论上讲,的确可以获取到想要的数据,但是就是效率低一点,会刻意的在某些表中,不去保存另外一张表的主键(逻辑主键)而是直接保存想要的数据信息,这样一来,在查询数据的时候,一张表可以直接提供数据,而不需要多表查询(效率低),但是会导致数据冗余。

5, MYSQL其它:

1,select查询用不到任何索引,但如果order by排序需要的字段上存在索引,也可能使用到索引。
2,复合索引会覆盖首字符单独索引!即避免重复索引。
3,索引的多关键字内容,覆盖了查询所select的全部数据,此时就不需要在数据区获取数据,而仅仅在索引区取内容即可。查询的时候避免全量select *.
4, 建立索引索引时,不要仅仅考虑where检索,同时考虑其他的使用场景。在所有的where字段上增加索引不合理
5, 要使用某个字段的索引,sql中要保证字段独立在一侧。而不能使用 age-1>10 这种。
6, Like查询左原则:匹配模式的左边必须确定,而不能用通配符。 像like %..% 需要使用全文索引。
7,MYSQL弃用索引:查询即使使用索引,也会导致出现大量的随机IO,甚至比全部顺序遍历IO开销还要大,则MYSQL会智能选择弃用索引。

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

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

相关文章

零知识证明在BSV网络上的应用

​​发表时间:2023年6月15日 2024年7月19日,BSV区块链主网上成功通过使用零知识证明验证了一笔交易。 零知识证明是一种技术,它允许一方(证明者)在不透露任何秘密的情况下,向另一方(验证者&…

TP-link-路由器上网设置(已有路由器再连接新的网线)

一、192.168.0.1进入管理界面,比如密码:D804D804。 二、这是设置连接账户和密码(比如账户:TP-LINK_F56C 比如密码:D804D804)登录后台管理、移动设备连接。比较固定。 三、 有的网络是分:&#…

JS面试真题 part1

JS面试真题 part1 1、说说JavaScript中的数据类型,储存上的差别2、说说你了解的js数据结构3、DOM常见的操作有哪些4、说说你对BOM的理解,常见的BOM对象你了解哪些5、 和 区别,分别在什么情况使用 1、说说JavaScript中的数据类型,…

K8s的Pv和Pvc就是为了pod数据持久化

一、 1.pv(persistent volume):是k8s虚拟化的存储资源,实际上就是存储,列如本地的硬盘、网络文件系统(Nfs)、lvm、RAID、云存储。 2.pvc:pod对存储资源的请求,定义了需…

MyBatis:解决数据库字段和Java对象字段不匹配问题及占位符问题

MyBatis:解决数据库字段和Java对象字段不匹配问题及占位符问题 文章目录 MyBatis:解决数据库字段和Java对象字段不匹配问题及占位符问题一、数据库字段和Java对象字段不匹配问题1、问题描述2、解决方案2.1、方案12.2、方案22.3、方案3 二、占位符问题1、…

ELK在Linux上部署教程

Docker Compose搭建ELK Elasticsearch默认使用mmapfs目录来存储索引。操作系统默认的mmap计数太低可能导致内存不足,我们可以使用下面这条命令来增加内存 sysctl -w vm.max_map_count262144创建Elasticsearch数据挂载路径 mkdir -p /echola/elasticsearch/data对…

Day 3 - 5 :线性表 — 单链表

存储结构 将线性表中的各元素分布在存储器的不同存储块,称为结点。 结点的data域存放数据元素ai,而next域是一个指针,指向ai的直接后继ai1所在的结点。 如果要删除a1,只要修改a1前手元素指针的指向即可。 例如:需要找到…

案例——Mysql主从复制与读写分离

目录 一、为什么需要主从复制 二、主从复制原理 2.1复制类型 2.2mysql主从复制的工作过程 2.2.1mysql主从复制延迟 2.3mysql的三种同步方式 2.3.1异步复制 2.3.2同步复制 2.3.3半同步复制 2.4mysql应用场景 三、主从复制实验 3.1主从服务器事件同步 3.1.1master服务…

Web 地图服务 简介

网络地图服务 网络地图服务 由通过互联网托管的地理空间数据组成,其标准由开放地理空间联盟 (OGC) 制定。WMS 支持在 Web 浏览器中以地图或图像的形式交换空间信息并通过 Web 查看。 网络地图服务有很多种类型。例如,一些最常见的格式是 WMS、WFS、WCS…

C140 杨辉三角

C140 杨辉三角 题目题解(94)讨论(102)排行面经 new 简单 通过率:29.57% 时间限制:1秒 空间限制:256M 知识点C工程师牛客 校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,…

tomato靶场攻略

1.使用nmap扫描同网段的端口,发现靶机地址 2.访问到主页面,只能看到一个大西红柿 3.再来使用dirb扫面以下有那些目录,发现有一个antibot_image 4.访问我们扫到的地址 ,点金目录里看看有些什么文件 5.看到info.php很熟悉&#xff0…

Java对象拷贝的浅与深:如何选择?

在日常开发中,我们经常需要将一个对象的属性复制到另一个对象中。无论是使用第三方工具类还是自己手动实现,都会涉及到浅拷贝和深拷贝的问题。本文将深入讨论浅拷贝的潜在风险,并给出几种实现深拷贝的方式,帮助大家避免潜在的坑。…

SpringBoot开发——整合Logbook进行HTTP API请求响应日志输出

文章目录 1. 简介依赖管理2. 实战案例2.1 基本用法2.2 结合Logback日志记录到文件2.3 自定义核心类Logbook2.4 自定义日志输出Sink2.5 与RestTemplate集成1. 简介 记录HTTP API请求响应日志对于监控、调试和性能优化至关重要。它帮助开发者追踪API的使用情况,包括请求来源、参…

基于ssm+vue+uniapp的“健康早知道”小程序

开发语言:Java框架:ssmuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:M…

好尴尬,借用的轮子在我这里还是没有运行起来

前期引用flask框架,由于版本不兼容,像是捅了flask-bug的窝。一开始是减低版本,然后一换卡一环,直接百度,试了很多办法都没有成功。 之后添加语句 下面展示一些 内联代码片。 # -*— coding:utf-8 -*— from datetime…

四战搜索,抖音难造“百度”

转载:新熵 原创 作者丨余寐 编辑丨九犁 抖音搜索野心暴露无遗!接连4次发起猛攻,这是要颠覆搜索市场的节奏?还是因为流量触顶,急寻新入口? 执念太深!抖音还是没放弃搜索,并发起一场…

人工智能在C/C++中的应用

随着技术的飞速发展,人工智能(AI)已经成为我们日常生活中不可或缺的一部分。从智能手机的语音助手到自动驾驶汽车,AI的应用无处不在。在众多编程语言中,C和C因其高性能和灵活性,成为实现复杂AI算法的理想选…

回调函数是什么,为什么要有回调函数?有什么优缺点?回调的本质是什么?

目录 前言 一、回调函数是什么? 二、为什么要有回调函数? 三、回调函数的优缺点 四、回调的本质是什么? 五、回调函数的实现方式 六、函数指针、Lambda 表达式、std::function: std::function这三者有什么不一样 1. 函数指…

仪表盘echarst

var bgColor #041F34,borderColor "#fff"let dataVal20 option {backgroundColor: bgColor,color: [borderColor],title: [{text: 处理率,x: center,top: 40%,textStyle: {color: #FFE600,fontSize: 56,fontWeight: 600,},},],series: [{type: pie,zlevel: 1,radi…

数据结构----高度为h的m叉树(记录一题)

(1)各层结点个数: 类比二叉树可得: 所以各层结点个数: (2)编号为i的结点的双亲结点(若存在)的编号是多少? 若存在表示:i>1(根节点没有双亲结点) 假设i结点有左兄弟和右兄弟&a…