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

【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 …...

微信总提示空间不足怎么办?三个方法随心选!

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

C语言每日一题(27)链表中倒数第k个结点

牛客网 链表中倒数第k个结点 题目描述 描述 输入一个链表&#xff0c;输出该链表中倒数第k个结点。 思路分析 这是一道经典的快慢指针题&#xff0c;fast和slow最开始都指向头结点&#xff0c;对于输入值k&#xff0c;先让快指针fast先走k步&#xff0c;之后再让两个指针一…...

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个缺省打开的文件描述符&#xff0c;分别是标准输入0&#xff0c; 标准输出1&#xff0c; 标准错误2&#xff0c; 0,1,2对应的物理设备一般是&#xff1a;键盘&#xff…...

Go进阶之rpc和grpc

文章目录 Go环境安装1&#xff09;windows2&#xff09;linux go语言编码规范1.1 包名&#xff1a;package1.2 ⽂件名1.3 结构体命名1.4 接⼝命名1.5 变量命名1.6 常量命名2.1 包注释2.2 结构&#xff08;接⼝&#xff09;注释2.3 函数&#xff08;⽅法&#xff09;注释2.4 代码…...

润和软件HopeStage与奇安信网神终端安全管理系统、可信浏览器完成产品兼容性互认证

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

模态对话框和非模态对话框

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

【算法与数据结构】39、LeetCode组合总和

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;这道题当中数字可以多次使用&#xff0c;那么我们在递归语句当中不能直接找下一个candidate的元素&…...

行政大厅满意度调查内容

行政大厅满意度调查的内容应该涵盖各个方面&#xff0c;以全面了解公众对行政大厅服务的满意度和意见。以下是可能包含在行政大厅满意度调查中的内容&#xff1a; 服务态度&#xff1a; 行政大厅工作人员的友好程度和专业水平。是否受到尊重和礼貌的待遇。 办事效率&#xf…...

WordPress页脚配置备案号

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

时间序列预测模型实战案例(十)(个人创新模型)通过堆叠CNN、GRU、LSTM实现多元预测和单元预测

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

【有源码】基于uniapp的农场管理小程序springboot基于微信小程序的农场检测系统(源码 调试 lw 开题报告ppt)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人七年开发经验&#xff0c;擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等&#xff0c;大家有这一块的问题可以一起交流&#xff01; &#x1f495;&…...

商城系统分布式下单

一、锁定库存的sql select * from ware where id{id} and total-lock>0 update ware set locklock{num} where id{id} and total-lock>{num} 二、下单服务要用分布式事务&#xff0c;因为seat的二阶段提交要说很多资源&#xff0c;会造成处理变成串行化&#xff0c;高并发…...

Java自学第5课:Java web开发环境概述,更换Eclipse版本

1 Java web开发环境 前面我们讲了java基本开发环境&#xff0c;但最终还是要转到web来的&#xff0c;先看下怎么搭建开发环境。 这个图就是大概讲了下开发和应用环境&#xff0c;其实很简单&#xff0c;对于一台裸机&#xff0c;win7 系统的&#xff0c;首先第1步&#xff0c;…...

[网鼎杯 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&#xff09;进入GDB  #gdb test test是要调试的程序&#xff0c;由gcc test.c -g -o test生成。进入后提示符变为(gdb) 。 2&#xff09;查看源码  (gdb) l 源码会进行行号提示。 如果需要查看在其他文件中定义的函数&#xff0c;在l后加上函数名即可定位到这…...

CH11_重构API

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

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

xmind转换为markdown

文章目录 解锁思维导图新姿势&#xff1a;将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件&#xff08;ZIP处理&#xff09;2.解析JSON数据结构3&#xff1a;递归转换树形结构4&#xff1a;Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...

篇章二 论坛系统——系统设计

目录 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 1. 数据库设计 1.1 数据库名: forum db 1.2 表的设计 1.3 编写SQL 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 通过需求分析获得概念类并结合业务实现过程中的技术需要&#x…...