当前位置: 首页 > article >正文

MySQL初阶:sql事务和索引

索引(index)

可以类似理解为一本书的目录,一个表可以有多个索引。

索引的意义和代价

在MySQL中使用select进行查询时会经过:

1.先遍历表

2.将条件带入每行记录中进行判断,看是否符合

3.不符合就跳过

但当表中的数据量非常大,这样的操作开销就会非常大,因为数据库是存储在硬盘上的,每次读取都会从硬盘上读取。

因此索引就是针对查询进行的优化手段,索引可以避免表进行遍历,加快查询的速度。

索引可以加快查询的速度但是有一定代价:

1.创建索引需要占用更多的空间,因为生成索引需要一定数据结构,以及一些额外的数据,来存储在硬盘中。

2.索引可能会使插入和删除降低速度,因为插入删除数据需要修改索引的内容,需要进行得工作更多。

索引的基本操作

1)查看索引

show index from 表名;

如果没有索引查看就是空。

当没加索引的列和加了索引的列一起进行查询时,效率会比单独查询索引列低。

2)创建索引

create index 索引名 on 表名(列名);

创建索引要在表名后设置列名,否则会报错。

当指定多行列时,此时创建的就是复合索引,复合索引采用最左边匹配,就是最左边的列,查询时要是id或id,name才能进行效率提升。

3)删除索引

drop index 索引名 on 表名;

删除索引只能删除自己创建的索引,而不能删除系统创建的索引。

索引不仅可以自己创建,系统也可以自动生成索引,例如primary key ,unique ,foreign key(主键,unique因为其中涉及到一些查找操作来判断是否重复存在相同的约束数据,外键则要判断父表中和子表中被约束数据的一致)

索引的创建是危险的操作,当数据量比较大的时候,创建索引,可能会使数据库卡死。

索引的实现原理

索引实质上也是基于数据结构实现的。

不同于二叉搜索树和哈希表,数据库要进行模糊匹配,而哈希表进行的是准确匹配;二叉搜索树的每一个节点都是只能有两个子树,这样就会增加遍历时的时间复杂度。

因此索引是由B+树这个N叉搜索树来实现的。

B树:B树的每个结点的度都是不确定的,一个结点的可以有N个key,因此可以划分成N+1个区间,这些区间又会划分出一系列的区间,这样就会减少树的高度,减少读硬盘的次数。

一个节点的数不是无限的,当达到一定数量就会分裂,同样的,当减少到一定数量就会触发合并。

B+树:B+树也是一个N叉树,每个节点有M个节点,可以划分成M个区间。

每一个节点中的最后一个数,相当于当前节点的最大值。

父节点上的每一个数都会以最大值的身份在子节点中出现,最终的叶子节点这一层会包含所有数。

B+树会使用链表这样的数据结构将叶子节点穿起来。

B+树:​​​​​​​

B+树相比B树,哈希表红黑树的优点:

1)N叉搜索树,降低了树的高度,降低了IO的次数。

2)擅长范围查询。

3)最终要落到叶子节点,时间开销稳定。

这里讨论的是最经典的B+树,但实际上MySQL数据库对此进行了一些优化。

事务

事务的特点

事务可以把多个sql打包成一个整体,可以保证这些sql要么全部执行,要么“一个都不执行”,这里的一个都不执行是指当一条sql执行错误时,数据库会进行一个回滚(rollback),回到一开始执行的时候。

事务将sql打包到一起,作为一个整体来执行,这样的特点叫做“原子性”。

事务使用

stat transation:开启事务,单独执行的sql是没有原子性的。

执行各种事务

commit:事务结束了

rollback:回滚(可以指定回滚)

事务的特性(重要)

1.原子性:通过回滚的方式让事务进行正确的执行,不然就回退到开始。

2.一致性:事务执行前后数据不能离谱,通常需要数据库约束和一些列检查机制来完成。

3.持久性:事务做出的修改,要持久保存在硬盘上。重启服务器,数据仍然存在。

4.隔离性(重要):数据库并发执行的时候涉及到的问题(并发执行:一个服务器连接多个客户端,当多个客户端发来请求,服务器就要同时处理两个请求)。

1)脏读问题:

一个事务A写数据,事务B读取数据,接下来A事务修改了数据,但是事务B没有改变,导致事务B读取的是一个无效的数据。

解决脏读问题的思路是:对写操作进行加锁。

此时并发性降低,隔离性提高,效率降低,准确性提高。

2)不可重复读

事务A在多次读取同一个数据时,读取出现不一样的情况,可能是在两次读操作之间事务B进行了修改,此时叫做不可重复读。

解决思路:将读操作进行加锁。

此时并发性降低,隔离性提高,效率降低,准确性提高。

3)幻读

事务A进行两次读操作,数据内容没变,但是结果集变了。

结果集:select * 表,查询到的临时表就是结果集。

例如第一次查询到的记录是1.张三,2.李四;但是第二次查询结果是1.张三,2.李四,3.赵六;

原来数据虽然没变,但是结果集变了,叫做幻读。

隔离级别

隔离级别就是在效率和数据正确性之间进行选择

mysql可以在配置文件中修改隔离级别,四种隔离级别可以解决上面的三种问题,可以根据实际需要更改配置文件。

1)read uncommitted(读未提交):并发程度最高,隔离性最低,准确性最低。

2)read committed (读以提交):引入了读加锁,并发程度降低,隔离性提高。

3)repeattable read(可重复读):引入了读加锁和写加锁,并发降低,隔离性提高。

4)serializable(串行化):一个一个执行事务,没有并发,隔离性最高。

相关文章:

MySQL初阶:sql事务和索引

索引(index) 可以类似理解为一本书的目录,一个表可以有多个索引。 索引的意义和代价 在MySQL中使用select进行查询时会经过: 1.先遍历表 2.将条件带入每行记录中进行判断,看是否符合 3.不符合就跳过 但当表中的…...

docker部署第一个Go项目

1.前期准备 目录结构 main.go package mainimport ("fmt""github.com/gin-gonic/gin""net/http" )func main() {fmt.Println("\n .::::.\n .::::::::.\n :::::::::::\n …...

day27 python 装饰器

目录 一、装饰器的基本概念 示例:用装饰器优化质数查找函数 二、装饰器的高级用法 1. 支持任意参数的装饰器 2. 装饰器的返回值处理 在 Python 编程中,装饰器是一个非常强大的功能,它可以让其他函数或方法在不需要做任何代码修改的前提下…...

Visual Studio2022跨平台Avalonia开发搭建

由于我已经下载并安装了 VS2022版本,这里就跳过不做阐述。 1.安装 Visual Studio 2022 安装时工作负荷Tab页勾选 ‌“.NET 桌面开发”‌ 和“Visual Studio扩展开发”‌ ,这里由于不是用的微软的MAUI,所以不用选择其他的来支持跨平台开发&a…...

css iconfont图标样式修改,js 点击后更改样式

背景: 在vue项目中,通过点击/鼠标覆盖,更改选中元素的样式,可以通过js逻辑,也可以根据css样式修改。包括以下内容:iconfont图标的引入以及使用,iconfont图标样式修改【导入文件是纯白&#xff0…...

开源项目实战学习之YOLO11:12.4 ultralytics-models-sam-memory_attention.py源码分析

👉 点击关注不迷路 👉 点击关注不迷路 👉 另外,前些天发现了一个巨牛的AI人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。感兴趣的可以点击相关跳转链接。 点击跳转到网站。 ultralytics-models-sam 1.sam-modules-memory_attention.pyblocks.py: 定义模…...

【沉浸式求职学习day42】【算法题:滑动窗口】

沉浸式求职学习 长度最小的子数组水果成篮 关于算法题:滑动窗口的几个题目 长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组…...

LIIGO ❤️ RUST 12 YEARS

LIIGO 💖 RUST 12 YEARS 今天是RUST语言1.0发布十周年纪念日。十年前的今天,2015年的今天,Rust 1.0 正式发行。这是值得全球Rust支持者隆重纪念的日子。我借此机会衷心感谢Rust语言创始人Graydon Hoare,Mozilla公司,以…...

Linux基础开发工具二(gcc/g++,自动化构建makefile)

3. 编译器gcc/g 3.1 背景知识 1. 预处理(进行宏替换/去注释/条件编译/头文件展开等) 2. 编译(生成汇编) 3. 汇编(生成机器可识别代码) 4. 连接(生成可执行文件或库文件) 3.2 gcc编译选项 格式 : gcc …...

Linux zip、unzip 压缩和解压

zip 命令用于压缩文件,压缩后的文件后缀名为 .zip 。 对应的解压命令是 unzip 。 测试用的目录结构如下, userzn:~/test$ tree . ├── folder1 │ ├── folder111 │ │ └── file1.txt │ └── main1.c ├── folder2 │ ├── …...

muduo库TcpConnection模块详解——C++

muduo库中的TcpConnection模块详解 TcpConnection是muduo库中处理TCP连接的核心模块,负责管理单个TCP连接的生命周期、数据读写、状态转换以及事件回调。每个TCP连接对应一个TcpConnection对象,其设计体现了高性能、线程安全和灵活回调的特点。 一、核心…...

Node.js 源码架构详解

Node.js 的源码是一个庞大且复杂的项目,它主要由 C 和 JavaScript 构成。要完全理解每一部分需要大量的时间和精力。我会给你一个高层次的概述,并指出一些关键的目录和组件,帮助你开始探索。 Node.js 的核心架构 Node.js 的核心可以概括为以…...

全局异常处理:如何优雅地统一管理业务异常

在软件开发中,异常处理是保证系统健壮性的重要环节。一个良好的异常处理机制不仅能提高代码的可维护性,还能为使用者提供清晰的错误反馈。本文将介绍如何通过全局异常处理和业务异常统一处理来编写更加优雅的代码。 一、传统异常处理的痛点 1.1 典型问…...

分布式锁: Redis和ZooKeeper两种分布式锁对比

在分布式系统中,分布式锁是协调多节点共享资源访问的核心机制。Redis 和 ZooKeeper 是两种常用的分布式锁实现方案,但两者的设计理念、适用场景和优缺点存在显著差异。本文将从 一致性模型、性能、可靠性、实现原理 等维度进行对比,并提供技术…...

动态规划-LCR 166.珠宝的最大价值-力扣(LeetCode)

一、题目解析 frame二维矩阵中每个值代表珠宝的价值,现在从左上角开始拿珠宝,只能向右或向下拿珠宝,到达右下角时停止拿珠宝,要求拿的珠宝价值最大。 二、算法解析 1.状态表示 我们想要知道的是到达[i,j]为位置时的最大价值&am…...

JDBC实现模糊、动态与分页查询的详解

文章目录 一. 模糊查询1. Mysql的写法2. JDBC的实现 二. 动态条件查询1. 创建生成动态条件查询sql的方法2. 完整的动态条件查询类以及测试类 三. 分页查询1. 什么是分页查询?2. 分页查询的分类3. MySQL的实现4. JDBC实现4.1. 创建page页4.2. 分页的实现 本章来讲一下…...

域环境信息收集技术详解:从基础命令到实战应用

引言 在企业网络环境中,Active Directory (AD)域服务是微软提供的集中式目录服务,用于管理网络中的用户、计算机和其他资源。对于信息安全专业人员来说,熟练掌握域环境信息收集技术至关重要,无论是进行渗透测试、安全评估还是日常…...

nodejs特性解读

单线程和事件驱动架构 参考 程序员dd-事件驱动架构 it-老齐-事件驱动架构 总结...

【C++ Qt】布局管理器

每日激励:“不设限和自我肯定的心态:I can do all things。 — Stephen Curry” 🤔绪论​: 在Qt开发中,界面布局的合理设计是提升用户体验的关键。早期,开发者常采用绝对定位的方式摆放控件,即通…...

vscode用python开发maya联动调试设置

如何在VScode里编写Maya Python脚本_哔哩哔哩_bilibili1 包括1,maya的python全面在vscode支持,2,通过mayacode发送到maya,3同步调试 import maya.cmds as cmds 1、让 maya.cmds编译通过 下载Autodesk_Maya_2018_6_Update_DEVK…...

SLAM定位常用地图对比示例

序号 地图类型 概述 1 格栅地图 将现实环境栅格化,每一个栅格用 0 和 1 分别表示空闲和占据状态,初始化为未知状态 0.5 2 特征地图 以点、线、面等几何特征来描绘周围环境,将采集的信息进行筛选和提取得到关键几何特征 3 拓扑地图 将重要部分抽象为地图,使用简单的图形表示…...

Ubnutu ADB 无法识别设备的解决方法

1. 正确安装adb 下载地址 2. 检查 Linux 是否识别设备 lsusb通过上述指令,分别查询插入、断开设备的usb设备表,如下所示: # 插入设备 adbc:~$ lsusb Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 011:…...

前端-HTML元素

目录 HTML标签是什么? 什么是HTML元素? HTML元素有哪些分类方法? 什么是HTML头部元素 更换路径 注:本文以leetbook为基础 HTML标签是什么? HTML标签是HTML语言中最基本单位和重要组成部分 虽然它不区分大小写&a…...

dagster的etl实现

本文展示了如何使用Dagster框架实现一个动态ETL(Extract, Transform, Load)流程。通过定义多个操作(op),包括生成动态任务、处理单个任务、收集结果和汇总结果,构建了一个动态任务处理流程。generate_tasks…...

python的漫画网站管理系统

目录 技术栈介绍具体实现截图![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/0ed2084038144499a162b3fb731a5f37.png)![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/a76a091066f74a80bf7ac1be489ae8a8.png)系统设计研究方法:设计步骤设计流程核…...

源码安装gperftools工具

源码安装gperftools工具 下载gperftools源码 https://github.com/gperftools/gperftools/releases/download/gperftools-2.16/gperftools-2.16.tar.gz 注:需要下载github上release版本,如果直接下载master分支上源码,将可能出现各种编译报错…...

QMK 宏(Macros)功能详解(实战部分)

QMK 宏(Macros)功能详解(实战部分) 一、宏的基本概念与作用 宏(Macros)是 QMK 固件中一项强大的功能,它允许您在按下单个按键时执行多个按键操作。通过宏,您可以: 输入常用短语或文本执行复杂的按键组合自动化重复性操作触发系统功能或快捷键🔔 安全提示:虽然可以…...

前端脚手架开发指南:提高开发效率的核心操作

前端脚手架通过自动化的方式可以提高开发效率并减少重复工作,而最强大的脚手架并不是现成的那些工具而是属于你自己团队量身定制的脚手架!本篇文章将带你了解脚手架开发的基本技巧,帮助你掌握如何构建适合自己需求的工具,并带着你…...

搜索引擎工作原理|倒排索引|query改写|CTR点击率预估|爬虫

写在前面 使用搜索引擎是我们经常做的事情,搜索引擎的实现原理。 什么是搜索引擎 搜索引擎是一种在线搜索工具,当用户在搜索框输入关键词时,搜索引擎就会将与该关键词相关的内容展示给用户。比较大型的搜索引擎有谷歌,百度&…...

Python实例题:Python自动工资条

目录 Python实例题 题目 python-automatic-payroll-slipPython 自动生成工资条脚本 代码解释 加载文件: 获取表头: 写入表头: 生成工资条: 保存文件: 运行思路 注意事项 Python实例题 题目 Python自动工资…...