【MySQL数据库】 六
本文主要介绍了数据库原理中数据库索引和事务相关概念.
一.索引
在查询表的时候,最基本的方式就是遍历表,一条一条筛选 .
因此,就可以给这个表建立索引,来提高查找的速度
比如,按照id建立索引
在数据库上额外搞一个空间维护一些id 相关的信息,
id:1 表的某个位置
id:2 表的某个位置
后续再按照id来查询,就不必直接遍历了,而是从索引中进行查询,根据索引就能够 , 初步判断锁定数据所在位置
索引,是用来提高查询效率的
1.缺陷
1.消耗额外空间
2.有可能拖慢增/删/改的速度
对于新增来说,不光要往表里写数据,同时还要修改索引
删除/修改,如果删除修改的条件,正好是和索引匹配还可以快点;如果涉及到索引列的删除/修改,这个时候也要需要维护索引
(好在大多数的业务场景中,是查询操作为主,增删改少很多,这种情况下,使用索引,就非常合适了 .
2.sql中使用索引
1.查看索引
show index from 表名;
- 对于class表,由于classid是主键,自动生成了一个索引
- 对于classes表,由于classid是unique,自动生成了一个索引
- 对于student表,由于classid是外键,也自动生成了索引
2.创建索引
手动创建索引
create index 索引名 on 表名 (字段名) ;
查看创建的索引
注意:
这个创建索引操作,可能会非常危险 !!
如果表是空的,或者表里的数据本身不多,创建索引,没关系;
如果表非空,并且包含了非常多的数据,创建索引,会引起非常大规模的硬盘IO操作,进一步就会导致数据库被卡死 !
3.删除索引
指定要删除的索引名和表名
drop index 索引名 on 表名;
删除索引,只能针对手动创建的索引 ; 自动生成的索引,是不能删除的;
如果需要给一个已经有很多数据的表创建/删除索引,并且这个数据库还是生产环境的数据库 ,怎么做 ?
冗余 !
数据库服务器往往不是单台服务器,为了整个系统的可靠性,通常会搞多个mysql服务器节点,这些节点的数据是一样的,能够提供相同的服务
因此可以先准备好一个新的mysql服务器,把表和索引都创建好,然后把数据都导入到新的服务器,再把要替换的mysql服务器关闭,把新的mysql服务器提上就行
其实sql除了增删改查之外,也支持一些其他的语法 (定义变量/条件/循环/函数)
但是并不建议使用复杂的sql
1.语法比较老了
2.不方便调试/优化
3.索引底层的数据结构
非常重要!!!!
mysql的索引的数据结构是什么样的数据结构?
不是一定的,取决于mysql使用哪个存储引擎
存储引擎
mysql里面包含很多模块
负责解析sql的
负责网络通信的
负责存储数据的 -- > 存储引擎 ,本质就是代码中的一个模块(包含了若干个代码文件)
具体如何存储数据,mysql支持多种存储方案
innodb当下最主流的一种方式
数据库组织数据使用的数据结构,是在硬盘上 !
对于内存上的数据结构,对于访问操作来说,是不敏感的;
但是硬盘上的数据结构,对于访问操作来说,比较敏感; 读写一次硬盘,开销远远大于内存
而索引,主要目的是为了进行快速查找 , 因此硬盘的读写对索引来说非常敏感 ! 太多的硬盘读写势必拖慢索引的速度 !
回忆学过的数据结构:
顺序表/链表/栈/队列/堆 都不行
1.哈希表
工作中最常用的数据结构
O(1)复杂度查询/插入/删除/修改数据
但是不适合数据库的查询场景
因为哈希表只能做精确查询,没法做到模糊查询和范围查询
2.红黑树
O(logN) 插入删除/修改/查询
也不适合数据库的查询场景
元素有序,可以处理范围查询
最大的问题,在于红黑树的高度,会在元素个数比较多的时候,变得比较高,因此会引入较多的硬盘IO
索引存储在硬盘上,每次比较都意味着硬盘IO操作
(1次硬盘IO操作相当于1万次内存IO操作)
上述讨论是针对mysql innodb存储引擎来讨论, 对于其他的存储引擎也可能会用到hash作为索引
3.B树
innodb使用的是B+树 , B+树是为了数据库量身定做的数据结构
要了解B+树,需要先了解B/B-树
B树的本质是是要给N叉搜索树
一个节点,可以保存多个key;
N个key可以延伸出N+1个分叉
(N个key可以划分出N+1)个区间
B树查询元素的流程:
拿着要查询的元素从根节点触发,判定要查找的元素是否在根节点上存在,
如果不存在,看这个元素是落在哪个区间里,就沿着这个区间的路线往下一个节点上找,最后找到叶子节点还不存在,就是真的不存在了.
此时每个节点上,都可以保存多个元素, 当总的元素个数固定,相比于二叉搜索树,涉及到的节点的总数就大大降低了,树的高度也大大降低了(B树的高度远远小于二叉搜索树的高度) , 因此进行查询的时候,硬盘IO的次数也随之减少了
注意:
对于数据库来说,每个节点,都需要把数据从硬盘上读出来才能进行比较 ;
但是一个节点有多个key,和一个节点有一个key,硬盘IO的开销是差不多的;
对于B树来说,进行插入和删除元素的时候,就涉及到拆分和合并的操作
一个节点,可以cun多个key,也不能无限的存,当存储的key数量达到一定程度的时候,
就需要把这个节点拆分,把这个节点的一部分key以书的子节点的方式来进行重新组织
拆分
合并
当key变少了就可以合并成一个节点
4.B+树
数据库索引的主角,在B树的基础上,进一步作出了一些改进 (针对数据库查询)
1)B+树也是N叉搜索树
但是N个key分出了N个区间
其中节点上的最后一个key就是最大值了
2)父节点的key会在子节点中重复出现 (而且是以最大值的身份)
看起来重复了很多元素,浪费了空间
实际上能够达成一个重要的效果:叶子节点这一层,包含了整个数据的全集
3)叶子节点,按照链表的方式,首尾相连
此时就可以通过叶子节点之间的连接,快速找到下一个,上一个元素,进一步也方便进行范围查询
比如查询id>=5 and id<=12
只需要确定开头和结尾 , 把中间的这段子链表拎出来就是范围查询的结果
以上是三个B+树的特点
优势
1.特别擅长范围查询
2.所有的查询都会落在叶子节点上,比较次数是均衡的 , 查询时间是稳定的 !
有的时候,稳定比快更重要 .
3.由于叶子节点上的完整的数据全集 .
因此表的每一行数据的其他列,都可以保存在叶子节点上,而非叶子节点,只存储索引的key即可 (只保存id)
其实在物理层面上,不需要表格这样的数据结构,直接使用B+树来存储这个表的数据,只是用户看起来像表格而已
此时,非叶子节点的存储空间,消耗是非常小的 ,可以在内存中缓存一份 ;
因此进行数据查询的时候,就可以通过内存来直接进行比较, 从而更快速的找到叶子节点的记录,又进一步地减少了硬盘IO的次数 .
,
这里的面试题:
介绍一下对数据库索引的认识
这里的回答包含前面索引的这个章节的所有内容
二.事务
事务的本质就是为了把多个操作,打包成一个操作来完成 (让这多个操作,要么全都执行成功 , 要么就一个都不执行 --->原子性 )
注意:
"一个都不执行" 不是真的不执行
执行成不成功,得执行了才知道
假设事务中有三个操作
先执行1 ,再执行2 , 最后执行3
真正执行之前,是不知道123哪一步会失败
如果中间执行到中间出错了 , 就需要自动把之前前面已经成功执行的操作,进行还原,还原会最初没有执行的模样, 本质上,这里的"一个都不执行",指的是 看起来和 没执行一样
还原的这个过程,把它称作回滚 .
实现过程:
把事务中的执行的每个操作都记录下来,如果需要回滚,就直接按照操作的逆操作来执行就可以
事务 -> 原子性 -> 回滚 ->特定的日志
1.使用
1.开启事务
start transaction
输入多个sql语句
2.提交事务
commit
把这些sql按照原子的方式进行执行(带回滚机制)
3.rollback回滚
手动触发回滚
一个事务必须以这两个操作结尾 , 接下来的各种sql操作都会被认为是事务的一部分 .
上述操作,在开发中往往是通过程序代码的方式来操作事务 , 不会用命令来操作事务 , 并且差异很大
2.事务的基本特性
1.原子性
保证多个操作被打包成一个整体 , 要么全部正确执行 ,要不一个都不执行
2.一致性
事务执行之前和事务执行之后,数据都能对上 (约束/回滚机制)
3.持久性
执行的各种操作都是持久生效的(最终写入到磁盘中的)
一旦事务执行成功了,这里的所有操作产生的修改,都会写到硬盘里的
4.隔离性
并发执行事务的时候,隔离性会在执行效率和数据可靠之间做出权衡,
隔离 描述的是同时执行的事务之间相互的影响;
隔离性越高,并发性越低 ; 数据越可靠, 性能就越低 ;
3.并发
简称理解成同时执行 .
在并发执行事务的过程中,可能产生以下问题:
1.脏读
读到了事务提交之前的中间数(脏数据)
解决方法: 引入写加锁 . 提交之前,不能读
2.不可重复读
一个事务之内,多次读取同一个数据,发现数据不一样(读的过程中,另一个事务修改
了数据)
解决方法:引入读加锁. 读的时候,不能修改了
3.幻读
一个事务之内,多次读到的数据,值相同,但是结果集不同
解决方法: 彻底串行化,完全放弃并发执行
逐渐往下,隔离性越高,数据越可靠,并发程度越低,
咱们可以根据实际的需求场景,来决定使用哪个隔离级别,找到一个效率和可靠性都能接受的情况
4.事务的隔离级别
mysql提供了四种事务的隔离级别
1.read uncommitted (RU)
允许读未提交的数据 (存在脏读/不可重复读/幻读问题)
2.read committed (RC)
允许提交已经提交的数据(给写加锁了,解决了脏读,存在不可重复读/幻读 )
3.repeatable read(RR)
可以重复读取数据(写写操作和读操作都加锁,解决了不可重复读的问题,存在幻读问题)
4.serializable
事务彻底串行执行 (解决了脏读/不可重读读/幻读)
默认的事务级别是RR
相关文章:

【MySQL数据库】 六
本文主要介绍了数据库原理中数据库索引和事务相关概念. 一.索引 在查询表的时候,最基本的方式就是遍历表,一条一条筛选 . 因此,就可以给这个表建立索引,来提高查找的速度 比如,按照id建立索引 在数据库上额外搞一个空间维护一些id 相关的信息, id:1 表的某个位置 id:2 …...

微信总提示空间不足怎么办?三个方法随心选!
微信显示空间不足会给用户带来很多困扰,比如影响手机的正常使用,占用大量存储空间,导致手机运行缓慢,没法分享图片和视频,影响我们的社交交流。下面提供了一些简单实用的方法。 方法一:清理微信缓存 1、打…...

C语言每日一题(27)链表中倒数第k个结点
牛客网 链表中倒数第k个结点 题目描述 描述 输入一个链表,输出该链表中倒数第k个结点。 思路分析 这是一道经典的快慢指针题,fast和slow最开始都指向头结点,对于输入值k,先让快指针fast先走k步,之后再让两个指针一…...
pdf转word
1、pip install pdf2docx 2、 from pdf2docx import Converterpdf_filerH:\测试.pdf docx_filerH:\测试_word.docxcvConverter(pdf_file) cv.convert(docx_file,start0,endNone) cv.close()会根据H目录中的pdf,在本目录自动生成相应的word...
LeetCode热题100——二叉树
二叉树 1. 二叉树中序遍历 1. 二叉树中序遍历...

【Linux】文件重定向以及一切皆文件
文章目录 前言一、重定向二、系统调用dup2三、重定向的使用四、一切皆文件 前言 Linux进程默认情况下会有3个缺省打开的文件描述符,分别是标准输入0, 标准输出1, 标准错误2, 0,1,2对应的物理设备一般是:键盘ÿ…...

Go进阶之rpc和grpc
文章目录 Go环境安装1)windows2)linux go语言编码规范1.1 包名:package1.2 ⽂件名1.3 结构体命名1.4 接⼝命名1.5 变量命名1.6 常量命名2.1 包注释2.2 结构(接⼝)注释2.3 函数(⽅法)注释2.4 代码…...

润和软件HopeStage与奇安信网神终端安全管理系统、可信浏览器完成产品兼容性互认证
近日,江苏润和软件股份有限公司(以下简称“润和软件”)HopeStage 操作系统与奇安信网神信息技术(北京)股份有限公司(以下简称“奇安信”)终端安全管理系统、可信浏览器完成产品兼容性测试。 测试…...

模态对话框和非模态对话框
创建到堆区这样非模态对话框就不会一闪而过 .exec使程序进入阻塞状态 ()[]{}lambda表达式 55号属性可以在对话框关闭的时候将堆区的内存释放掉从而防止内存泄露...

【算法与数据结构】39、LeetCode组合总和
文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析:这道题当中数字可以多次使用,那么我们在递归语句当中不能直接找下一个candidate的元素&…...
行政大厅满意度调查内容
行政大厅满意度调查的内容应该涵盖各个方面,以全面了解公众对行政大厅服务的满意度和意见。以下是可能包含在行政大厅满意度调查中的内容: 服务态度: 行政大厅工作人员的友好程度和专业水平。是否受到尊重和礼貌的待遇。 办事效率…...

WordPress页脚配置备案号
进入后台管理页面 后台管理页面地址一般是:域名/wp-admin 在指定位置加入代码 点击外观 -> 主题文件编辑器 在右侧的文件中选择 footer.php,[注意:上方的主题需要是你自己选择的对应的主题]在 </footer>标签这一行的上一行中加入代码 <di…...

时间序列预测模型实战案例(十)(个人创新模型)通过堆叠CNN、GRU、LSTM实现多元预测和单元预测
本文介绍 本篇博客为大家讲解的是通过组堆叠CNN、GRU、LSTM个数,建立多元预测和单元预测的时间序列预测模型,其效果要比单用GRU、LSTM效果好的多,其结合了CNN的特征提取功能、GRU和LSTM用于处理数据中的时间依赖关系的功能。通过将它们组合在…...

【有源码】基于uniapp的农场管理小程序springboot基于微信小程序的农场检测系统(源码 调试 lw 开题报告ppt)
💕💕作者:计算机源码社 💕💕个人简介:本人七年开发经验,擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等,大家有这一块的问题可以一起交流! 💕&…...
商城系统分布式下单
一、锁定库存的sql select * from ware where id{id} and total-lock>0 update ware set locklock{num} where id{id} and total-lock>{num} 二、下单服务要用分布式事务,因为seat的二阶段提交要说很多资源,会造成处理变成串行化,高并发…...

Java自学第5课:Java web开发环境概述,更换Eclipse版本
1 Java web开发环境 前面我们讲了java基本开发环境,但最终还是要转到web来的,先看下怎么搭建开发环境。 这个图就是大概讲了下开发和应用环境,其实很简单,对于一台裸机,win7 系统的,首先第1步,…...
[网鼎杯 2020 青龙组]AreUSerialz
[网鼎杯 2020 青龙组]AreUSerialz <?phpinclude("flag.php");highlight_file(__FILE__);class FileHandler {protected $op;protected $filename;protected $content;function __construct() {$op "1";$filename "/tmp/tmpfile";$content…...

使用Kotlin与Unirest库抓取音频文件的技术实践
目录 摘要 一、Kotlin与Unirest库概述 二、使用Kotlin和Unirest抓取音频文件 1、添加Unirest依赖 2、发送HTTP请求获取音频文件 3、保存音频文件 三、完整代码示例 四、注意事项 结论 摘要 本文详细阐述了如何使用Kotlin编程语言与Unirest库抓取网络上的音频文件。首…...
gdb调试常用命令
基本命令 1)进入GDB #gdb test test是要调试的程序,由gcc test.c -g -o test生成。进入后提示符变为(gdb) 。 2)查看源码 (gdb) l 源码会进行行号提示。 如果需要查看在其他文件中定义的函数,在l后加上函数名即可定位到这…...

CH11_重构API
将查询函数和修改函数分离(Separate Query from Modifier) function getTotalOutstandingAndSendBill() {const result customer.invoices.reduce((total, each) > each.amount total, 0);sendBill();return result; }function totalOutstanding() …...

python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...

如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...

Rust 开发环境搭建
环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu 2、Hello World fn main() { println…...