数据库的索引

索引的特点

1)加快查询的速度

2)索引自身是一种数据结构,也要占用存储空间

3)当我们需要进行增删改的时候,也要对索引进行更新(也需要额外的空间开销)

sql操作

查看索引

show index from 表名;

查看某个表是否有索引,以及有几个索引

⚠在没有约束的情况下,数据表的索引是无法显示出来的

MySQL的unique,primary key和foreign key都可以自动生成索引

一个表的索引可以有多个,每个索引都是根据某个具体的列来展开的

创建索引

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

这个操作要慎用,如果表本身就有很多数据,此时创建索引操作会触发大量的IO

删除索引

drop index 索引名 on 表名;


索引底层的数据结构 

采用B+树作为数据结构,前身B树,也叫B-树

B树是一个N叉搜索树,在二叉搜索树上进行拓展,要求这里是有序的

一个节点上可能包含N个值,N个值划分出N+1个区间

同样的高度的树,能表示的元素比二叉搜索树就多很多了

当采用B树进行查询时,总的比较次数增加了,但是同一个结点的这些key都是一次硬盘IO就都出来了,也就相当于内存1万多次的比较了


B+树是在B树上进行了改进

B+树的特点

1. 同样是N叉搜索树,每个结点包含多个key,N个key划分出N个区间

2. 每个结点的N个key中,会存在一个最大值

3. 每个结点的key,都会在子树中重复出现

(重复出现的好处:所有的数据都包含在叶结点这一层中)

4. 把叶结点站之间采用链式结构进行相连

1)此时进行范围查询,id>=4 and <= 10

先根据4找到对应的位置,沿着链表往后遍历到10就找到了

如果没有这个链式结构,就可能需要反复的对树进行回溯,就会很麻烦

2)针对B+树的查询时间是稳定的

查询任何一个元素,都是需要从根节点查询到子节点的

过程中经过的硬盘IO次数是一样的

3)只需要在叶结点存储数据,其他非叶节点存储key就行(这个key占用的空间很小)


数据库的事务

很多时候进行多个sql的操作,我们是希望将它们打包在一起的

第一个解决办法:不让数据库挂

但是数据库真挂了,我们也要有一个应对措施,采用事务

事务可以保证上面两个sql语句要么都执行成功,要么都不执行

(都不执行其实是有执行的,只是数据库恢复的时候,把数据都还原回去了,这叫回滚

那数据库咋知道之前的数据是多少?

数据库对于事务有特殊的机制(undo log + redo log),通过日志打印,写道文件里

数据库中间挂了,但是日志已经记录下来了,数据库重启之后会读取之前的日志,对于在执行一半的事务会进行操作回滚


事务的核心特性

1.原子性。通过事务将多个操作打包在一起(事务最重要特性)

2.一致性。原子性的延申,当数据库中间出问题了,不会出现上述钱凭空消失的情况

另一方面,通过约束避免数据出现一些非法情况

3.持久性。事务任何的修改都是持久化存在(写入硬盘的),无论是重启程序,还是重启主机,修改都不会消失

4.隔离性。多个事务并发执行的时候会带来一些问题。通过隔离性来对问题进行权衡,看希望数据准确还是希望速度尽量快


并发:一个服务器会涉及多个客户端。如果多个客户端同时给数据库发起事务请求,就叫做并发执行事务

如果多个事务是修改不同的表,问题不大;修改相同的表会产生一些bug

典型bug1:脏读问题

当前两个事务1,2,其中事务1修改了某些数据但还未提交

事务2也读取了同一个数据,此时事务2读到的数据可能是一个脏的数据,因为事务1后续可能还要修改这个数据

解决脏读问题,核心思路是降低事务并发程度。

给写操作加锁(意味着在释放锁之前你是不可访问的)

写的时候不能读,写完提交(释放锁)后才可读

典型bug2:不可重读性

这个是写加锁的前提下导致的问题。虽然写加锁了,但是可以分成多个事务,多次提交的方式来修改数据。

有事务1,2。其中事务1先修改数据(写加锁),此时事务2想读数据,就需要等事务1提交完

等到事务1终于提交了之后,事务2开始读数据

又多了一个事务3,事务3又修改了上述的数据。导致事务2在读的过程中,两次读到的结果不同

也就是事务2在读的同时事务3又在写

所以解决这个问题很简单,给读加个锁就行了,相当于加个约定,读的时候不能写

典型bug3:幻读

有事务1,2。事务1修改数据,提交;事务2开始读数据

此时事务3新增了一个其他的数据,此时事务2就可能出现两次读取的结果集不同

解决幻读问题,用串行化,不进行任何并发了,每个事务是进行串行进行的

执行完第一个,再执行第二个,再执行第三个


MySQL配置中,提供了隔离级别的选项,程序员可以根据需要调整隔离级别,适应不同的情况

1)read uncommited 读未提交,并行程度最高,隔离程度最低,效率最高,数据最不靠谱,可能出现上面的三个bug

2)read commited 读已提交,相当于给写操作加锁,并行程度降低,隔离程度提高,效率降低,数据更靠谱

3)repeatable read 可重复读,相当于给读操作和写操作都加锁了。但可能出现幻读

4)serializable 串行化 让所有事务串行执行,数据最靠谱


使用

start transaction; --执行事务之前,开启事务commit; --告诉服务器,事务完毕rollback; --告诉服务器要进行回滚

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

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

相关文章

node后端接口无法插入数据为emoji的表情的问题

原因 emoji的表情一般是这样的\xF0\x9F\x98\x80或者是\xF0\x9F\x98 &#xff0c;事实上 一般数据库的utf8的编码类型都是能保存\xF0\x9F\x98 但是不能保存\xF0\x9F\x98\x80这种样的emoji&#xff0c;要将数据库编码格式为utf8mb4 也就是utf8的超集 另外&#xff0c;除了 数据库…

Java核心知识点整理大全27-笔记(已完结)

目录 30. 云计算 30.1.1. SaaS 30.1.2. PaaS 30.1.3. IaaS 30.1.4. Docker 30.1.4.1. 概念 30.1.4.2. Namespaces 30.1.4.3. 进程(CLONE_NEWPID 实现的进程隔离) 30.1.4.4. Libnetwork 与网络隔离 30.1.4.5. 资源隔离与 CGroups 30.1.4.6. 镜像与 UnionFS 30.1.4.7.…

vue+electron问题汇总

1. Vue_Bug Failed to fetch extension, trying 4 more times 描述&#xff1a;项目启动时报错 解决&#xff1a;注释图片中内容 2. Module not found: Error: Can’t resolve ‘fs’ in 描述&#xff1a;项目启动报错 解决&#xff1a;vue.config.js中添加图中数据 3.导入…

学习php中使用composer下载安装firebase/php-jwt 以及调用方法

学习php中使用composer下载安装firebase/php-jwt 以及调用方法 1、安装firebase/php-jwt2、封装jwt类 1、安装firebase/php-jwt composer require firebase/php-jwt安装好以后出现以下文件: 2、封装jwt类 根据所使用的php框架&#xff0c;在指定目录创建 Token.php <?ph…

好莱坞明星识别

一、前期工作 1. 设置GPU from tensorflow import keras from tensorflow.keras import layers,models import os, PIL, pathlib import matplotlib.pyplot as plt import tensorflow as tfgpus tf.config.list_physical_devices("GPU")if gpus:gpu0 …

clickhouse的向量化执行

背景 clickhouse快的很大一部分原因来源于数据的向量化执行&#xff0c;本文就来看一下向量化执行和正常标量执行的区别 SIMD的向量化执行 从上图可知&#xff0c;clickhouse通过SIMD指令可以做到一个cpu周期操作两个向量的运算操作&#xff0c;比起普通的cpu指令效率提高了N…

Linux库之动态库静态库

一、什么是库&#xff08;Library&#xff09; 二、库的分类 三、静态库、动态库优缺点 四、静态库的制作和使用 五、动态库的制作和使用 SO-NAME–解决主版本号之间的兼容问题 基于符号的版本机制 共享库系统路径 共享库的查找过程 有用的环境变量 gcc 编译器常用选项 Linux共…

八个适合女大学生做的赚钱小副业

大学的生活可以说是多姿多彩&#xff0c;既有沉浸在课堂知识中的学习&#xff0c;也有课余时间可以自由支配的自我发展。然而&#xff0c;作为一名女大学生&#xff0c;除了追求优异的学业表现&#xff0c;是否还有其他更加多元化且有意义的方式来充实自己呢&#xff1f; 当然&…

vue el-select多选封装及使用

使用了Element UI库中的el-select和el-option组件来构建多选下拉框。同时&#xff0c;也包含了一个el-input组件用于过滤搜索选择项&#xff0c;以及el-checkbox-group和el-checkbox组件用于显示多选项。 创建组件index.vue (src/common-ui/selectMultiple/index.vue) <tem…

linux云服务器开启防火墙注意事件

重要的事情先说三遍: linux云服务器开启防火墙要先获取到云服务器的管理界面控制权!! linux云服务器开启防火墙要先获取到云服务器的管理界面控制权!! linux云服务器开启防火墙要先获取到云服务器的管理界面控制权!! 也就是能打开这个页面: 为什么这么说呢?如果你…

4.Java程序设计-基于springboot得在线考试系统

编程技术交流、源码分享、模板分享、网课分享 企鹅&#x1f427;裙&#xff1a;772162324 摘要&#xff1a; 本文设计并实现了一款基于Spring Boot框架的在线考试系统小程序。随着远程学习和在线教育的普及&#xff0c;对于灵活、便捷的在线考试系统的需求逐渐增加。该小程序…

数字图像处理(实践篇) 十六 基于分水岭算法的图像分割

目录 一 分水岭算法 二 利用OpenCV实现分水岭算法的过程 三 实践 一 分水岭算法 基于任何灰度图像都可以视为地形表面&#xff0c;其中高强度表示山峰和山丘&#xff0c;而低强度表示山谷。首先&#xff0c;开始用不同颜色的水&#xff08;标签&#xff09;填充每个孤立的山…

dell服务器安装PERCCLI

因在linux 系统中无法查看系统磁盘的raid级别&#xff0c;也无法得知raid状态&#xff0c;需要安装额外的包来监控&#xff0c;因是dell服务器&#xff0c;就在dell网站中下载并安装 1、下载链接&#xff1a;驱动程序和下载 | Dell 中国https://www.dell.com/support/home/zh-…

Ubuntu 安装 MySQL8 配置、授权、备份、远程连接

目录 0100 系统环境0200 下载0300 安装0400 服务管理0401 关闭、启动、重启服务0402 查看服务状态 0500 查看配置文件0600 账号管理0601 添加账号0602 删除账号0603 修改密码0604 忘记root密码 0700 自动备份0800 远程访问 0100 系统环境 [rootlocalhost ~]# cat /proc/versio…

github首次将文件合到远端分支,发现名字不是master,而是main

其中&#xff0c;暂存区和本地仓库的信息都存储在.git目录中 在自己的github上实践 1、刚开始&#xff0c;git clone gitgithub.com:lingze8678/my_github.git到本地 2、在克隆后的代码中加入一个pdf文件 3、在git bash中操作&#xff08;当项目中有文件更改和删除&#xff…

DAPP开发【02】Remix使用

系列文章目录 系列文章在DAPP开发专栏 文章目录 系列文章目录使用部署测试网上本地项目连接remix本地项目连接remix 使用 创建一个新的工作空间 部署测试网上 利用metaMask连接测试网络 添加成功&#xff0c;添加时需要签名 即可进行编译 即可部署 本地项目连接remix 方…

Python中读写(解析)JSON文件的深入探究

目录 一、引言 二、如何读取JSON文件 三、如何写入JSON文件 四、如何解析JSON字符串 五、错误处理和异常处理 六、使用第三方库提高效率 七、总结 一、引言 在Python中&#xff0c;我们经常使用JSON&#xff08;JavaScript Object Notation&#xff09;格式来存储和传输…

在pom.xml中添加maven依赖,但是类里面import导入的时候报错

问题&#xff1a; Error:(27, 8) java: 类TestKuDo是公共的, 应在名为 TestKuDo.java 的文件中声明 Error:(7, 23) java: 程序包org.apache.kudu不存在 Error:(8, 23) java: 程序包org.apache.kudu不存在 Error:(9, 23) java: 程序包org.apache.kudu不存在 Error:(10, 30) jav…

一.初始typescript

什么是ts 首先我们要确认typescript是一个语言&#xff0c;是等同于JavaScript层级得&#xff0c;并不是一些人认为得是JavaScript得类型规范工具或者插件。 ts与js的差异 从type script这个名字就可以看出&#xff0c;ts其实是JavaScript的一个类型化超集&#xff0c;它增…

网安领域含金量最高的证书有哪些?看这1篇就足够了!

文章目录 一、前言二、CISP三、CISAW四、NISP五、为什么很多人考不下来 一、前言 现在想找网络安全之类的工作&#xff0c;光有技术是不够的&#xff0c;还得有东西证明自己&#xff0c;网安三大敲门砖&#xff1a;CTF、漏洞证明和专业证书。 对于CTF的话只是少数人能参加的&…