Mysql深入讲解(索引、事务、锁机制)

一、MySQL索引

1、何为索引?

MySQL中的索引是一种数据结构,用于加快对数据库表中数据的查询速度【查询速度提升】。它类似于书本目录,使得用户可以根据特定字段快速定位到所需的数据行,而无需扫描整个表。

2、索引分类

Hash索引

Hash索引的数据结构Hash表

Hash索引讲解

1、将所要查找的索引字段值放入公式f(x)中,从而会生成对应的HashCode值,所算出来的HashCode值会快速定位对应相应表中的行数据,从而达到快速查找。

2、若出现几个行数据所对应的hashCode相同【hash碰撞】,则会在这些对应相同的hashCode的行数据中进行顺序查找操作,直到找到为止。

B+Tree索引

B+Tree索引的数据结构B+树【多叉树结构】MySQL索引的本质就是B+Tree的数据结构

节点存储的是【区间】,叶子节点存储的是【数据记录的地址】;叶子节点处形成链表,便于锁定区间【头,尾】,易获取值。

详细分析

Mysql查询语句:select * from tableTest where id = 2;
底层原理分析:由于是根据id来建索引的,因此会根据id来进行查找。其中内部节点会根据节点存储的键值来决定进入哪个子节点,一直进行查找,最终找到所在id的叶子节点。叶子节点处所存储的是数据记录的地址,通过地址来找到与之相对应的行数据。

3、索引的优点

  • 借助数据结构,实现快速检索

4、索引的缺点

  • 占用表空间,挤压数据的存储。
  • 维持平衡的开销大

5、索引失效的场景

  • 数据量少的表不要使用索引

  • where之后未加索引字段【注意:许多查询语句都需要用这字段【where后面出现的频次高】,适合建立索引】

  • 重复数据多且更新频繁的字段不建议设置索引。

  • where name like ‘%男’【左边有%,就无法建立,右边有无无影响】

6、常用索引实际应用

索引在功能上可分类为单列索引【普通索引,唯一索引,主键索引】组合索引全文索引空间索引

查看索引

-- show index from 表名
show index from student;

删除索引

-- drop index 索引名 on 表名
drop index index_name on student;

创建索引

一:单列索引操作

单列索引介绍:一个索引只包含单个列,而一个表中可含有多个单列索引。

普通索引

要求无任何限制,任意的列都能作为普通索引。

-- 创建索引
-- create index 索引名称 on 表(字段名)
create index name_index on student(name);-- 修改表结构(添加索引)
-- alter table 表 add index 索引名(字段名)
alter table student add index index_age(age);
唯一索引

要求:列中的值必须是唯一的,不可重复,但允许为空

-- 创建索引
-- create unique index 索引名 on 表(字段名)
create unique index index_card_id on student(card_id);-- 修改表结构(添加索引)
-- alter table 表 add unique 索引名(字段名)
alter table student add unique index_phone_num(phone_num);
主键索引

说明:mysql会自动在主键列上建立一个索引【唯一且非null】

二:组合索引操作

要求:多个字段进行组合,列值组合必须唯一【查询时,遵循最左原则,即:查询条件中包含(phone_num字段)或(phone_num字段和name字段),索引才会生效】

-- 组合索引(普通索引组合)
-- create index index 索引名 on 表(列1,列2,..)
create index index_phone_name on student(phone_num,name);-- 组合索引(唯一索引组合)
-- create unique index 索引名 on 表(列1,列2,..)
create unique index index_phone_name on student(phone_num,name);

二、MySQL事务

1、何为事务?

事务是数据库管理系统执行过程中的一个逻辑单位,它由一个或多个SQL语句组成,这些语句作为一个整体一起向系统提交要么全部执行,要么全部不执行

2、事务的特性

  • 原子性:事务是一个不可再分的整体,要么全部执行,要么全部不执行。

  • 一致性:事务必须使数据库从一个一致性状态变换到另一个一致性状态。例如:对于转账而言,两者转账前钱的总和与转账后钱的总和要一样,否则会出错。

  • 隔离性:保证在数据库系统中并发执行的事务不会相互干扰,每个事务看起来就像在独立运行,避免了数据错乱和不一致的问题。

    事务的隔离级别

  • 持久性:事务一旦提交(commit),就会进行落盘操作,无法再改变。

3、事务的实际操作

事务有三大操作开启事务(begin)回滚事务(rollback)提交事务(commit)

此处,以账户转账的案例来讲解事务的运用。

-- 创建account账户信息表
create table if not exists account(id int primary key auto_increment,name varchar(255),money double
);
-- 插入数据
insert into account values
(1,'猪猪侠',1000),
(2,'小菲菲',1000);# 事务案例:账户转账
-- 设置 MySQL 的事务为手动提交(关闭自动提交)
-- 查看状态
select @@autocommit; // 1为自动提交,0为手动提交
-- 关闭自动提交
set autocommit = 0;-- 模拟账户转账
-- 【开启事务】
begin;
-- 开始转账操作
update account set money = money - 520 where `name` = '猪猪侠';
update account set money = money + 520 where `name` = '小菲菲';
-- 查看转账结果
select * from account;
-- 若易过程中遇到错误,则【回滚事务】至原来状态,此时数据存储在【内存】,还未落盘(二选一)
rollback;
-- 若没有问题,则【提交事务】,【落盘】,不可再进行回滚操作(二选一)
commit;-- 开启自动提交
set autocommit = 1;

三、MySQL锁机制

1、何为锁?

锁是协调多个事务同时并发访问相同资源的机制(避免争抢),确保数据的完整性和一致性,避免多个事务同时对同一数据造成冲突和错误。当多客户端来访问共享资源时,可通过锁机制来保证共享资源可以得到合理访问

2、锁的分类

数据操作的粒度来划分:表锁行锁

表锁解释:操作是会锁定整个表

行锁解释:操作时会锁定当前操作行

从数据操作的角度来划分:读锁(共享锁)写锁(排他锁)

读锁(共享锁):简称S,对于同一份数据,读操作可以同时进行且互不干扰。

写锁(排他锁):简称X,当前操作还未完成前,他会阻断其他写锁和读锁操作。

表锁操作:

一:读锁(共享锁)

对【表R】添加读锁时,**只能操作被上读锁的那张【表R】**进行select查找操作,无法对其他表进行select查找操作

-- 添加读锁
-- 语法:lock table 表名 read;
lock table tb_lock read;-- 释放锁
unlock tables;
二:写锁(排他锁)

当【用户A】对【表R】添加写锁时,【用户A】可以对表R进行查找或修改操作其他用户无法对【表R】进行读取或修改等操作,以及对【表R】添加任意锁操作直到【用户A】释放锁

-- 添加写锁
-- 语法:lock table 表名 write;
lock table tb_lock write;-- 释放锁
unlock tables;

行锁操作:

注意:增删改时会自动添加

一:读锁(共享锁)
select * from 表名 where 条件 lock in share mode
二:写锁(排他锁)
select * from 表名 where 条件 for update-- 添加写锁
-- 语法:lock table 表名 write;
lock table tb_lock write;-- 释放锁
unlock tables;

行锁操作:

注意:增删改时会自动添加

一:读锁(共享锁)
select * from 表名 where 条件 lock in share mode
二:写锁(排他锁)
select * from 表名 where 条件 for update

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

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

相关文章

怎样对 PostgreSQL 中的慢查询进行分析和优化?

🍅关注博主🎗️ 带你畅游技术世界,不错过每一次成长机会!📚领书:PostgreSQL 入门到精通.pdf 文章目录 怎样对 PostgreSQL 中的慢查询进行分析和优化?一、理解慢查询的危害二、找出慢查询&#x…

Linux可视化工具-netdata之docker安装

版本要求 docker cli安装 docker pull netdata/netdata docker run -d --namenetdata \ --pidhost \ --networkhost \ -v netdataconfig:/etc/netdata \ -v netdatalib:/var/lib/netdata \ -v netdatacache:/var/cache/netdata \ -v /:/host/root:ro,rslave \ -v /etc/passwd…

[集成学习]基于python的Stacking分类模型的客户购买意愿分类预测

1 导入必要的库 import pandas as pd import numpy as np import missingno as msno import matplotlib.pyplot as plt from matplotlib import rcParams import seaborn as sns from sklearn.metrics import roc_curve, auc from sklearn.linear_model import LogisticRegres…

业务架构、数据架构、应用架构和技术架构分析

一文看懂:什么是业务架构、数据架构、应用架构和技术架构 TOGAF(开放集团架构框架)是企业广泛应用的架构设计和管理利器。其核心在于四大架构领域:业务、数据、应用和技术,助力组织高效运作。TOGAF,让架构设…

【深度学习入门篇 ⑩】Seq2Seq模型:语言翻译

【🍊易编橙:一个帮助编程小伙伴少走弯路的终身成长社群🍊】 大家好,我是小森( ﹡ˆoˆ﹡ ) ! 易编橙终身成长社群创始团队嘉宾,橙似锦计划领衔成员、阿里云专家博主、腾讯云内容共创官…

【Sklearn-混淆矩阵】一文搞懂分类模型的基础评估指标:混淆矩阵ConfusionMatrixDisplay

【Sklearn-混淆矩阵】一文搞懂分类模型的基础评估指标:混淆矩阵ConfusionMatrixDisplay 本次修炼方法请往下查看 🌈 欢迎莅临我的个人主页 👈这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合,智慧小天地! &…

unity渲染人物模型透明度问题

问题1:有独立的手和衣服的模型,但最终只渲染出来半透明衣服 问题2:透明度贴图是正确的但显示却不正确 这上面两个模型的问题都是因为人物模型是一个完整的,为啥有些地方可以正常显示,有些地方透明度却有问题。 其中…

使用C#实现无人超市管理系统——数据结构课设(代码+PPT+说明书)

说明:这是自己做的课程设计作业,得分情况98/100 如果想要获取私信我 本项目采用线性表中的链表来进行本次系统程序的设计。链表分为两条线,分别是存储用户信息和商品信息,并且都设为公共属性,方便对用户信息和商品信息…

艺术与技术的交响曲:CSS绘图的艺术与实践

在前端开发的世界里,CSS(层叠样式表)作为网页布局和样式的基石,其功能早已超越了简单的颜色和间距设置。近年来,随着CSS3的普及,开发者们开始探索CSS在图形绘制方面的潜力,用纯粹的代码创造出令…

基于python深度学习遥感影像地物分类与目标识别、分割实践技术应用

目录 专题一、深度学习发展与机器学习 专题二、深度卷积网络基本原理 专题三、TensorFlow与Keras介绍与入门 专题四、PyTorch介绍与入门 专题五、卷积神经网络实践与遥感图像场景分类 专题六、深度学习与遥感图像检测 专题七、遥感图像检测案例 专题八、深度学习与遥感…

字节码编程之bytebuddy结合javaagent支持多种监控方式

写在前面 打印方法执行耗时是监控,获取程序运行的JVM信息是监控,链路追踪也是监控。 本文看下如何实现一个通用的监控解决方案。 1:程序 定义premain: package com.dahuyou.multi.monitor;import com.dahuyou.multi.monitor.…

数据库内核研发学习之路(五)创建postgres系统表

写在前面 在使用postgres的时候,有很多表是我们一开始安装好数据库就存在的,这些表称为系统表,他们记载一些数据库信息,比如我们做运维工作常用的pg_stat_activity;我们在数据库中查询这张表可以发现他存储了一些数据库连接信息。…

GO:Socket编程

目录 一、TCP/IP协议族和四层模型概述 1.1 互联网协议族(TCP/IP) 1.2 TCP/IP四层模型 1. 网络访问层(Network Access Layer) 2. 网络层(Internet Layer) 3. 传输层(Transport Layer&#…

WPF+Mvvm 项目入门完整教程(一)

WPF+Mvvm 入门完整教程一 创建项目MvvmLight框架安装完善整个项目的目录结构创建自定义的字体资源下载更新和使用字体资源创建项目 打开VS2022,点击创建新项目,选择**WPF应用(.NET Framework)** 创建一个名称为 CommonProject_DeskTop 的项目,如下图所示:MvvmLight框架安装…

【JavaScript 算法】双指针法:高效处理数组问题

🔥 个人主页:空白诗 文章目录 一、算法原理二、算法实现示例问题1:两数之和 II - 输入有序数组示例问题2:反转字符串中的元音字母注释说明: 三、应用场景四、总结 双指针法(Two Pointer Technique&#xff…

深入理解Java并发线程阻塞唤醒类LockSupport

LockSupprot 用来阻塞和唤醒线程,底层实现依赖于Unsafe类 该类包含一组用于阻塞和唤醒线程的静态方法,这些方法主要是围绕 park 和 unpark 展开 public class LockSupportDemo1 {public static void main(String[] args) {Thread mainThread Thread.cu…

微信小程序(百战商城)的实战项目的首页的制作及讲解

👨‍💻个人主页:开发者-曼亿点 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 曼亿点 原创 👨‍💻 收录于专栏&#xff1a…

【人工智能】基于香橙派AIpro和昇腾AI计算芯片的面部口罩检测(详细教程)

目录 前言 1.介绍开发板 2.应用场景 3.安装操作系统 3.1 下载工具 3.2 烧录系统 3.3 系统装载 4.配置操作系统 4.1 登录系统账户 4.2 配置网络连接 4.3 查看设备网络 4.4 配置远程连接 5.部署目标检测应用 5.1 准备运行环境 5.2 模型二次训练 ​5.3 热成像温度…

数据结构 day4

目录 思维导图: 学习内容: 1. 链表的引入 1.1 顺序表的优缺点 1.1.1 优点 1.1.2 不足 1.1.3 缺点 1.2 链表的概念 1.2.1 链式存储的线性表叫做链表 1.2.2 链表的基础概念 1.3 链表的分类 2. 单向链表 2.1 节点结构体类型 2.2 创建链表 2.…

pikachu之暴力破解

1基于表单的暴力破解 随便输入然后抓包 选中添加账号密码 添加分别添加payload1,2,的字典 开始攻击 2验证码绕过on server 和基于表单的暴力破解相比,多了一个验证码功能 这个验证码是前端的验证码(和前面那个一样选中添加账号密码…