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

news2024/9/23 0:36:12

一、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.coloradmin.cn/o/1938542.html

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

相关文章

C 语言回调函数

回调函数的概念 您的理解是正确的。pFunCallBack 是一种函数指针类型,它定义了函数的签名(即函数的参数类型和返回类型)。当我们说 pFunCallBack pFun,我们是在声明一个变量 pFun,其类型是 pFunCallBack —— 即一个函…

【D3.js in Action 3 精译_018】2.4 向选择集添加元素

当前内容所在位置 第一部分 D3.js 基础知识 第一章 D3.js 简介(已完结) 1.1 何为 D3.js?1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践(上)1.3 数据可视化最佳实践(下)1.4 本章小结 第二章…

RNN循环递归网络讲解与不掉包python实现

1.算法简介 参考论文:Elman J L. Finding structure in time[J]. Cognitive science, 1990, 14(2): 179-211.,谷歌被引次数超16000! 说到循环递归结构就不得不提到其鼻祖RNN网络。首先我们先对RNN有个初步的概念:想象一下,你正在…

[紧急!!!]20240719全球Windows10/11蓝屏问题,CrowdStrike导致的错误解决方案

文章目录 前言一、CrowdStrike是什么?二、PC解决方式(网路上大神的方式,虚拟机测试过)1.Windows PC 上 CrowdStrike BSOD 问题的官方解决方法:2.阻止CrowdStrick启动-命令行法3.阻止CrowdStrick启动-注册表法 三、AWS …

基于Matlab的数据可视化

基于Matlab的数据可视化 一、二维图形的绘制(一)基本图形函数(1)plot函数(2)fplot函数(3)其他坐标系的二维曲线 (二)图形属性设置(1)线…

对某次应急响应中webshell的分析

文章前言 在之前处理一起应急事件时发现攻击者在WEB应用目录下上传了webshell,但是webshell似乎使用了某种加密混淆手法,无法直观的看到其中的木马连接密码,而客户非要让我们连接webshell来证实此文件为后门文件且可执行和利用(也是很恼火&a…

数据结构与算法04二叉树|二叉排序树|AVL树

目录 一、二叉树(binary tree) 1、二叉树常见术语 2、二叉树常用的操作 2.1、初始化:与链表十分相似,先创建节点,然后构造引用/指针关系. 2.2、插入和删除操作 3、常见二叉树类型 3.1、满二叉树 3.2、完全二叉树(complete b…

跳跃游戏Ⅱ - vector

55. 跳跃游戏 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:bool canJump(vector<int>& nums) {int n nums.size();int reach 0;for(int i 0; i < n; i){if(i > reach){return false;}reach max(inums[i], reach);}return true;} }; …

SpringBoot3 + Vue3 学习 Day 2

登入接口 和 获取用户详细信息的开发 学习视频登入接口的开发1、登入主逻辑2、登入认证jwt 介绍生成 JWT① 导入依赖② 编写代码③ 验证JWT 登入认证接口的实现① 导入 工具类② controller 类实现③ 存在的问题及优化① 编写拦截器② 注册拦截器③ 其他接口直接提供服务 获取用…

JVM(day4)类加载机制

类加载过程 加载 通过一个类的全限定名来获取定义此类的二进制字节流。 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。 在内存中生成一个代表这个类的java.lang.Class对象&#xff0c;作为方法区这个类的各种数据的访问入口。 验证 文件格式验证 元数…

LeetCode做题记录(第二天)647. 回文子串

题目&#xff1a; 647. 回文子串 标签&#xff1a;双指针 字符串 动态规划 题目信息&#xff1a; 思路一&#xff1a;暴力实现 我们直接for套for分割成一个个子串再判断&#xff0c;如果子串是回文子串&#xff0c;就1&#xff0c;最后得出结果 代码实现&#xff1a; cl…

C语言实例-约瑟夫生者死者小游戏

问题&#xff1a; 30个人在一条船上&#xff0c;超载&#xff0c;需要15人下船。于是人们排成一队&#xff0c;排队的位置即为他们的编号。报数&#xff0c;从1开始&#xff0c;数到9的人下船&#xff0c;如此循环&#xff0c;直到船上仅剩15人为止&#xff0c;问都有哪些编号…

Missing script:‘dev‘

场景&#xff1a; npm run dev 原因&#xff1a;没有安装依赖&#xff0c;可用镜像安装&#xff08;详见下图ReadMe 蓝色字体&#xff09;&#xff0c;没安装依赖可从package-lock.json文件是否存在看出&#xff0c;存在则有依赖 解决&#xff1a;

KMP算法(算法篇)

算法之KMP算法 KMP算法 概念&#xff1a; KMP算法是用于解决字符串匹配的问题的算法&#xff0c;也就是有一个文本串和一个模式串&#xff0c;求解这个模式串是否在文本串中出现或者匹配。相对于暴力求解&#xff0c;KMP算法使用了前缀表来进行匹配&#xff0c;充分利用了之…

【Vue3】从零开始编写项目

【Vue3】从零开始编写项目 背景简介开发环境开发步骤及源码总结 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努力学习奋斗的…

神经网络模型实现(训练、测试)

目录 一、神经网络骨架&#xff1a;二、卷积操作&#xff1a;三、卷积层&#xff1a;四、池化层&#xff1a;五、激活函数&#xff08;以ReLU为例&#xff09;&#xff1a;六、模型搭建&#xff1a;七、损失函数、梯度下降&#xff1a;八、模型保存与加载&#xff1a;九、模型训…

Linux下安装JDK、Tomact、MySQL以及Nginx的超详细步骤

目录 1、为什么安装这些软件 2、安装软件的方式 3、安装JDK 3.1 下载Linux版本的JDK 3.2 将压缩包拖拽到Linux系统下 3.3 解压jdk文件 3.4 修改文件夹名字 3.5 配置环境变量 4、安装Tomcat 4.1 下载Tomcat 4.2 将Tomcat放入Linux系统并解压&#xff0c;步骤如上面的…

MenuToolButton自绘控件,带下拉框的QToolButton,附源码

MenuToolButton自绘控件&#xff0c;带下拉框的QToolButton 效果 下拉样式可自定义 跟随QToolButton的Qt::ToolButtonStyle属性改变图标文字样式 使用示例 正常UI文件创建QToolButton然后提升&#xff0c;或者直接代码创建都可以。 // 创建一个 QList 对象来存储 QPixm…

JDK、JRE、JVM的区别java的基本数据类型

说一说JDK、JRE、JVM的区别在哪&#xff1f; JDK&#xff1a; Java Delopment kit是java工具包&#xff0c;包含了编译器javac&#xff0c;调试器&#xff08;jdb&#xff09;以及其他用于开发和调试java程序的工具。JDK是开发人员在开发java应用程序时候所需要的的基本工具。…

10道JVM经典面试题

1、 JVM中&#xff0c;new出来的对象是在哪个区&#xff1f; 2、 说说类加载有哪些步骤&#xff1f; 3、 JMM是什么&#xff1f; 4、 说说JVM内存结构&#xff1f; 5、 MinorGC和FullGC有什么区别&#xff1f; 6、 什么是STW? 7、 什么情况下会发生堆/栈溢出&#xff1f…