MySQL 篇-快速了解事务、索引

🔥博客主页: 【小扳_-CSDN博客】
❤感谢大家点赞👍收藏⭐评论✍
  

文章目录

        1.0 事务概述

        1.1 事务四大特性(ACID)

        2.0 索引概述

        2.1 关于 “索引一定要创建在主键上?” 的问题

        2.2 索引操作语法

        2.3 索引结构


        1.0 事务概述

        事务是作为单个逻辑工作单元执行的一组数据库操作,要么全部成功执行,要么全部失败回滚,保证数据的完整性。

        默认 MySQL 的事务是自动提交的,也就是说,当执行一条 DML 语句,MySQL 会立即隐式的提交事务。

        用简单通俗的话来说,将 SQL 每一条语句都 “打包” 起来一起执行,如果某一条语句出现错误,则进行回滚操作,最终可以使得数据回复到原来的样子;如果 “打包” 在一起的语句都没有出现错误,则进行提交操作,数据就会进行相应的变化并保持持久性。

语法结构:

-- 开启事务,接下来的 SQL 语句都会打包起来
start transaction;-- 如果这些语句都没有出现错误的话,可以提交事务
commit;-- 如果这些语句,哪怕有一条语句出现错误,则操作回滚事务
rollback;

        1.1 事务四大特性(ACID)

        1)原子性(A):事务是不可分割的最小单元,要么全部成功,要么全部失败。

        2)一致性(C):事务完成时,必须使所有数据都保持一致状态。

        3)隔离性(I):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。

        4)持久性(D):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。

        2.0 索引概述

        在 MySQL 中,索引是一种数据结构,用于加快数据库表中数据的检索速度。通过在表的列上创建索引,可以帮助数据库系统快速定位到符合检索条件的记录,从而提高查询效率。

索引的优点:

        提高数据查询的效率,降低数据库的 IO 成本。通过索引列对数据进行排序,降低数据排序的成本,降低 CPU 消耗。


索引的缺点:
        索引会占用存储空间,索引大大提高了查询效率,同时却也降低了 insert, update, delete 的效率。

        总的来说,优点大于缺点,实际中大多数的操作都是查询操作,至于插入、修改、删除的操作占小部分。

        2.1 关于 “索引一定要创建在主键上?” 的问题

        不,索引并不一定要创建在主键上。虽然主键通常会自动创建一个唯一索引,但在实际数据库设计中,还可以在其他列上创建索引以提高查询性能。
        在设计索引时,需要根据实际的查询需求和数据访问模式来选择合适的列进行索引。一些常见的情况包括:

        主键索引:主键用于唯一标识表中的每条记录,通常会自动创建一个主键索引。主键索引在查询单条记录时非常高效。


        外键索引:外键用于建立表与表之间的关联关系,可以在外键列上创建索引以加快关联查询的速度。


        经常用于查询的列:如果某个列经常用于查询条件或排序操作,可以考虑在该列上创建索引,以提高查询效率。


        经常用于连接的列:如果某个列经常用于连接操作(如 JOIN 语句),可以在连接列上创建索引,加速连接操作。

        补充:在 MySQL 中,默认加上主键约束、UNIQUE 约束都会自动创建索引

        2.2 索引操作语法

        1)创建索引

create [unique] index 索引名 on 表名(字段名);

        2)查看索引

show index from 表名;

        3)删除索引

drop index 索引名 on 表名;

        4)举个例子,在创建图书表,表中的字段有 id, name, author, update_time ,为了通过查询书名来快速得到书的信息,就可以在书名这个字段创建索引。

代码如下:

create table books(id tinyint unique primary key comment '序号',name varchar(10) not null comment '书名',author varchar(10) not null comment '作者',update_time datetime comment '更新时间'
)comment '图书';-- 添加数据
insert into books
values (1, 'Java', '小童', now()),(2, 'C++', '小鱼', now()),(3, 'Python', '小吴', now());

创建索引:

-- 创建索引在书名上,可以通过查找书名,快速找到
create index index_books_name on books(name);

查看表中的索引:

-- 查看表中的所有索引
show index from books;

        有两个字段创建了索引,一个主键 (id) 是默认创建了索引,另一个 (name) 是自己手动创建的索引。

删除表中的索引:

-- 删除表中的索引
drop index index_books_name on books;

再来查看表中的索引情况,

        可以看到 name 这个字段上的索引已经被删除了。

       

        2.3 索引结构

        在上面说到,索引就是一个数据结构,创建索引,就是在将该列中的数据按照规定的数据结构进行重新存储整理起来,从而在查询过程中,可以快速的查询相对应的数据。所以对于没有创建索引,查询指定的数据时,是通过全盘扫描的方式进行。

        那么 MySQL 中,索引是基于 B 树(B-tree) 或者 B+ 树(B+tree) 结构实现的,这些树结构是一种高效的数据结构,可以加速数据库表中的检索速度。

B 树 (B-tree):
        B 树是一种平衡的多路搜索树,用于在数据库中存储和管理索引数据。B 树的特点是每个节点可以存储多个关键字,并且具有平衡性,保证查询的时间复杂度为 O(logN) 。在 MySQL 中,普通索引、唯一索引和主键索引通常都是基于 B 树结构实现的。


B+ 树 (B+tree):
        B+ 树是在 B 树的基础上做了一些优化,更适合作为数据库索引的数据结构。B+ 树的非叶子节点只存储索引字段的值,而实际数据都存储在叶子节点上,这样可以减少磁盘 I/O 操作。B+ 树的叶子节点之间通过指针连接,形成一个有序链表,方便范围查询和排序操作。在 MySQL 中,InnoDB 存储引擎的聚簇索引(Clustered Index)就是基于 B+ 树结构实现的。

对于 B+ 树来说:1)每一个节点可以存储多个 key (有 n 个 key ,就有 n 个指针)。2)所有的数据都存储在叶子节点,非叶子节点仅用于索引数据。3)叶子节点形成了一个双向链表,便于数据的排序及区间范围查询。

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

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

相关文章

JavaWeb实验 JSP内置对象

实验目的 掌握JSP内置对象的使用;内置对象包括out\request\response\cookie等。 实验内容 【1】创建一个JSP网页,文件名为index.jsp,利用request内置对象获取客户端访问ip的功能,屏蔽用户利用局域网实际ip访问Web,但…

技术选型思考:分库分表和分布式DB(TiDB/OceanBase) 的权衡与抉择

在当今数据爆炸的时代,数据库作为存储和管理数据的核心组件,其性能和扩展性成为了企业关注的重点。随着业务的发展和数据量的不断增长,传统的单库单表架构逐渐暴露出性能瓶颈和扩展性限制。为了应对这些挑战,企业常常需要在分库分…

15. C++泛型与符号重载

【泛型编程】 若多组类型不同的数据需要使用相同的代码处理,在C语言中需要编写多组代码分别处理,这样做显然太过繁琐,C增加了虚拟类型,使用虚拟类型可以实现一组代码处理多种类型的数据。 虚拟类型是暂时不确定的数据类型&#…

数据中台:数字中国战略关键技术设施

文章目录 每日一句正能量前言为何要建设数据中台数据中台建设痛点数据中台学习资料聚焦前沿,方法论体系更新与时俱进,紧跟时代热点深入6大行业,提炼实践精华大咖推荐,数字化转型必备案头书购买链接赠书活动 每日一句正能量 人生之…

找不到本地组策略编辑器解决办法

创建记事本写入以下命令 echo offpushd "%~dp0"dir /b %systemroot%\Windows\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientExtensions-Package~3*.mum >gp.txtdir /b %systemroot%\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientTools-…

Django会话

一、Cookie介绍 1.1、背景介绍 HTTP协议有一个特性就是无状态的,是指协议对于交互性场景没有记忆能力 随着动态交互的web应用的出现,HTTP的无状态特性严重阻碍了动态交互应用程序的发展,例如一些购物网站在进行购物时候都会进行了页面跳转/刷新,按照HTTP的无状态协议岂不…

Compose UI 之 MediumLarge TopAppBar

Medium&Large TopAppBar 前面文章介绍了 Small 类型的 TopAppBar:TopAppBar CenterAlignedTopAppBar 。下来介绍 Medium 和 Large 类型的 TopAppBar:MediumTopAppBar LargeTopAppBar 。 MediumTopAppBar 上面介绍了Small 类型的 TopAppBar (TopAp…

实战|环信 Vue2 uniapp Demo重构焕新!经典再升级!

项目背景 当前环信 uni-app vue2 Demo 地址升级版本 Github 地址(临时) 原版本功能实现方式较混乱,代码逻辑晦涩难懂,不利于开发者参考或复用。此实战项目在确保原项目功能保留的情况下进行完全重写并新增大量功能,以…

【C语言】指针相关知识点

什么是指针? 指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地…

Golang搭建grpc环境

简介 OS : Windows 11 Golang 版本: go1.22.0 grpc : 1.2 protobuffer: 1.28代理 没有代理国内环境下载不了库七牛CDN (试过可用) go env -w GOPROXYhttps://goproxy.cn,direct阿里云代理(运行grpc时下载包出现报错 ): go env -w GOPROXYhttps://mirr…

黑马点评-异步秒杀实现

异步秒杀思路 我们来回顾一下下单流程 当用户发起请求,此时会请求nginx,nginx会访问到tomcat,而tomcat中的程序,会进行串行操作,分成如下几个步骤 1、查询优惠卷 2、判断秒杀库存是否足够 3、查询订单 4、校验是…

Axure Cloud如何给每个原型配置私有域名

需求 在原型发布之后,自动给原型生成一个独立访问的域名,类似http://u591bi.axshare.bushrose.cn,应该如何配置呢? 准备事项 已备案域名 如何备案?阿里云备案流程 已安装部署Axure Cloud 如何安装部署,请…

WordPress建站入门教程:如何创建菜单和设置前端导航菜单?

前面我们跟大家分享了WordPress如何上传安装WordPress主题,但是启用主题后前端没有看到有导航菜单,这是因为我们还没有创建菜单和设置导航菜单。 JianYue主题导航菜单和右上角菜单 今天boke112百科就继续跟大家分享WordPress站点如何创建菜单和设置前端…

Kafka入门及生产者详解

1. Kafka定义 传统定义:分布式的、基于发布/订阅模式的消息队列,主要用于大数据实时处理领域。发布/订阅模式中,发布者不会直接将消息发送给特定的订阅者,而是将发布的消息分为不同的类别,订阅者只接受感兴趣的消息。…

Linux系统Docker部署DbGate并结合内网穿透实现公网管理本地数据库

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法|MySQL| ​💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-66GkyG9g7oNq7tl8 {font-family:"trebuchet ms",verdana,arial,sans-serif;f…

基于yolov5的草莓成长期检测系统,可进行图像目标检测,也可进行视屏和摄像检测(pytorch框架)【python源码+UI界面+功能源码详解】

功能演示: 基于yolov5的草莓成长期检测系统,支持图像检测,视频检测和实时摄像检测功能_哔哩哔哩_bilibili (一)简介 基于yolov5的草莓成长期检测系统是在pytorch框架下实现的,成长期分为3类:…

加密与安全_使用Java代码操作RSA算法生成的密钥对

文章目录 Pre概述什么是非对称加密算法?如何工作?示例:RSA算法特点和优势ECC:另一种非对称加密算法 Code生成公钥和私钥私钥加密私钥加密私钥解密 ( 行不通 )私钥加密公钥解密公钥加密和公钥解密 (行不通)保…

字符指针变量

在指针的类型中我们知道有⼀种指针类型为字符指针 char* 1.一般使用方法如下: int main() { char ch w; char *pc &ch; *pc w; return 0; } 2.还有⼀种使⽤⽅式如下: int main() { const char* pstr "hello world."; printf("…

吴恩达深度学习笔记:深度学习引言1.1-1.5

目录 第一门课:神经网络和深度学习 (Neural Networks and Deep Learning)第一周:深度学习引言(Introduction to Deep Learning)1.1 欢迎(Welcome)1.2 什么是神经网络?(What is a Neural Network)1.3 神经网络的监督学习(Supervised Learning …

Linux系统——Haproxy高性能负载均衡软件

目录 一、Haproxy介绍 1.Haproxy定义 2.Haproxy主要特性 二、安装Haproxy 1.yum安装 2.第三方rpm包安装 3.编译安装 3.1解决Lua环境 3.2编译安装Haproxy 三、配置文件详解 1.状态页 2.日志管理 2.1定义日志到其他主机站点 3.指定进程线程个数 4.cpu亲缘性 5.多进…