数据库的索引

索引的特点

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; --告诉服务器要进行回滚

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

安装postgresql驱动及python使用pyodbc指定postgresql驱动调用postgresql

注&#xff1a;Python解释器版本(32位/64位)和postgresql驱动版本(32位/64位)需一致。 一、安装postgresql驱动 https://www.postgresql.org/ftp/odbc/versions/msi/ &#xff08;1&#xff09;32位&#xff1a; &#xff08;2&#xff09;64位&#xff1a; 双击安装。全程默…

如何让软文更具画面感,媒介盒子分享

写软文这种带有销售性质的文案时&#xff0c;总说要有画面感&#xff0c;要有想象空间。只有针对目标用户的感受的设计&#xff0c;要了解用户想的是什么&#xff0c;要用可视化的描述来影响用户的感受&#xff0c;今天媒介盒子就和大家分享&#xff1a;如何让软文更具画面感。…

axios调接口传参特殊字符丢失的问题(encodeURI 和 encodeURIComponent)

1、axios调接口特殊字符丢失的问题 项目开发过程中遇到一个接口传参&#xff0c;参数带特殊字符&#xff0c;axios调接口特殊字符丢失的问题 例如接口&#xff1a; get/user/detail/{name} name是个参数直接调接口的时候拼到接口上&#xff0c;get/user/detail/test123#$%&am…

IntelliJ IDEA图形安装教程

IntelliJ IDEA图形安装教程 之前开始Java程序&#xff0c;一直用的eclipse&#xff0c;觉得还可以。一直听说IntelliJ IDEA比eclipse好用很多&#xff0c;但因为比较懒&#xff0c;也没有学习使用。机缘巧合下&#xff0c;尝试用了下&#xff0c;顿时有种相见恨晚的感觉&#…

如何核销百川云网站监测兑换码

注册/登录百川云平台 在电脑端输入百川云网址“https://rivers.chaitin.cn/“&#xff0c;会出现以下界面&#xff1a; 2.点击右上角“立即注册”&#xff0c;使用微信扫一扫注册&#xff0c;注册成功之后&#xff0c;系统会自动跳转到百川云工作台。 免费开通“百川云网站监测…

什么是HTTPS加密协议? ️

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

FreeRTOS系统延时函数分析

一、概述 FreeRTOS提供了两个系统延时函数&#xff0c;相对延时函数vTaskDelay()和绝对延时函数vTaskDelayUntil()。相对延时是指每次延时都是从任务执行函数vTaskDelay()开始&#xff0c;延时指定的时间结束&#xff0c;绝对延时是指每隔指定的时间&#xff0c;执行一次调用vT…

水声功率放大器是什么(驱动水声换能器的原理是什么)

水声功率放大器是一种用于增大水声信号的电子设备。它是水声系统中的关键部件&#xff0c;通常用于驱动水声换能器&#xff0c;将低功率的电信号转换为高功率的水声信号。 水声功率放大器是声呐发射机的重要组成部分&#xff0c;用来提高输出功率,驱动换能器向水中辐射足够能量…

项目管理:为什么项目计划必不可少

项目管理计划定义了如何执行、监督和控制项目。项目计划让我们准确地知道在项目的每个阶段应该做什么&#xff0c;在哪里分配资源和时间&#xff0c;以及在事情超出计划或超出预算时要注意什么。 为了项目中获得成功&#xff0c;管理者需要在前期创建一个项目计划&#xff0c…

高效率:使用DBeaver连接spark-sql

提高运行效率一般采取底层使用spark引擎替换成hive引擎的方式提高效率&#xff0c;但替换引擎配置较为复杂考虑到兼容版本且容易出错&#xff0c;所以本篇将介绍使用DBeaver直接连接spark-sql快速操作hive数据库。 在spark目录下运行以下命令&#xff0c;创建一个SparkThirdSe…

免费通配符和免费多域名证书

免费通配符证书&#xff0c;其特点在于能够为一个主域名及其所有子域名提供加密保护。通常&#xff0c;通配符证书的主域名会以通配符&#xff08;*&#xff09;表示&#xff0c;比如*.example.com&#xff0c;这样就覆盖了blog.example.com、api.example.com等所有子域名。 免…

【高数:1 映射与函数】

【高数&#xff1a;1 映射与函数】 例2.1 绝对值函数例2.2 符号函数例2.3 反函数表示例2.4 双曲正弦sinh&#xff0c;双曲余弦cosh&#xff0c;双曲正切tanh 参考书籍&#xff1a;毕文斌, 毛悦悦. Python漫游数学王国[M]. 北京&#xff1a;清华大学出版社&#xff0c;2022. 例2…

【SQL开发实战技巧】系列(四十九):Oracle12C常用新特性☞表分区部分索引(Partial Indexes)

系列文章目录 【SQL开发实战技巧】系列&#xff08;一&#xff09;:关于SQL不得不说的那些事 【SQL开发实战技巧】系列&#xff08;二&#xff09;&#xff1a;简单单表查询 【SQL开发实战技巧】系列&#xff08;三&#xff09;&#xff1a;SQL排序的那些事 【SQL开发实战技巧…

【c】杨辉三角

下面介绍两种方法 1.利用上面性质的第五条&#xff0c;我们可以求各行各列的组合数 2.利用上面性质的第7条&#xff0c;我们可以用数组完成 下面附上代码 1. #include<stdio.h> void fact(int n ,int m )//求组合数 {long long int sum11;long long int sum21;int a…

玩转大数据10:深度学习与神经网络在大数据中的应用

目录 1. 引言&#xff1a;深度学习和神经网络在大数据中的重要性和应用场景 2. 深度学习的基本概念和架构 3. Java中的深度学习框架 3.1. Deeplearning4j框架介绍及Java编程模型 3.2. DL4J、Keras和TensorFlow的集成 4. 大数据与深度学习的结合 4.1. 大数据与深度学…

快递批量查询高手:物流效率提升的秘密武器

在当今这个数字化时代&#xff0c;物流行业的发展迅速&#xff0c;快递公司如雨后春笋般涌现。随之而来的是物流查询的困扰。如何快速、准确地查询大量快递单号&#xff0c;提高物流效率&#xff0c;成为了物流行业亟待解决的问题。而此时&#xff0c;一款名为《快递批量查询高…

Linux下查看端口占用

第一种&#xff1a;通过命令查看 1.netstat -ntulp&#xff1a;查看所有的被占用的端口 在列表中最后一列就列出了&#xff0c;某个端口被占用的进程 其中&#xff1a; -t : 指明显示TCP端口 -u : 指明显示UDP端口 -l : 仅显示监听套接字(所谓套接字就是使应用程序能够读写与收…

RabbitMQ(一)概述

1 RabbitMQ 概念 RabbitMQ 是一个消息中间件&#xff1a;它接受并转发消息。你可以把它当做一个快递站点&#xff0c;当你要发送一个包裹时&#xff0c;你把你的包裹放到快递站&#xff0c;快递员最终会把你的快递送到收件人那里&#xff0c;按照这种逻辑 RabbitMQ 是一个快递站…

柏睿网络分析:为什么微模块化机房越来越受欢迎?

与传统机房相比&#xff0c;微模块化机房的建设周期更短&#xff0c;扩展性更强&#xff0c;能耗更低&#xff0c;运维难度也相对较低。因此&#xff0c;微模块化机房是一种高效、灵活、节能的机房解决方案&#xff0c;适用于各种规模的数据中心。 一体化分布式部署&#xff1a…

VIR-SLAM代码分析3——VIR_VINS详解之estimator.cpp/.h

前言 续接上一篇&#xff0c;本本篇接着介绍VIR-SLAM中estimator.cpp/.h文件的函数&#xff0c;尤其是和UWB相关的相比于VINS改动过的函数&#xff0c;仍然以具体功能情况代码注释的形式进行介绍。 重点函数介绍 优化函数&#xff0c;代码是先优化&#xff0c;后边缘化。 …