MySQL数据库的索引以及事务详解

news2024/12/23 15:22:03

课前导读:

本章设计到MySQL数据库的索引和事务操作,索引操作设计的概念内容比较多,但是他涉及到数据库的内部运行效率和使用空间等多方面知识,相比比较重要,也需要进行相关学习。而事务操作更不用多说,是我们进行数据库操作的保障!这方面只是主要是便于面试准备!


目录

课前导读:

一、索引

1、概念

2、作用

3、索引操作

4、索引的运行

5、索引的数据结构:B+树

二、事务

1、事务认识:

2、事务操作:

3、事务四大特性:

4、MySQL的隔离性

总结:


一、索引

1、概念

索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引,并指定索引的类型,各类索引有各自的数据结构实现。

2、作用

  • 数据库中的表、数据、索引之间的关系,类似于书架上的图书、书籍内容和书籍目录的关系
  • 索引所起的作用类似书籍目录,可用于快速定位、检索数据
  • 索引对于提高数据库的性能有很大的帮助
  • 对我们的MySQL操作来说索引最大的作用就是提高运行效率,但不是所有索引都能提高效率的

3、索引操作

  (1)查看索引:show index from 表名;

例如:show index from adc;

但我们会想,明明没有创建索引为什么能查到索引呢,这时候我们就要看看这个表中的字段约束了。

可以看见id是primary key主键的,idnumber 是唯一的,这就是他们拥有索引的原因了,主键非空且唯一,需要索引进来判断他的唯一性,所以MySQL会自动帮我们创建索引,unique也是这样的。

  (2)创建索引:create index 索引名字 on 表名(列名); 

 例如:create index name_index on adc(name);

 可以看见和上面相比,我们创建了name的索引了,我们就可以通过name来进行查询了。

但是如果表中有很多数据(成千上万)的时候进行索引创建时,是一个危险操作,因为这样创建会吃掉很多磁盘io,会花掉很多时间,但创建的这段时间数据库是无法使用的,会带来很大的损失,所以我们最好在建表时进行索引的创建!

  (3)删除索引:drop index 索引名字 on 表名;

例如:drop index name_index on adc;

 这个删除操作和创建索引一样是个危险操作,会吃掉大量磁盘io。需要在建表时决定好是否需要这个索引!

4、索引的运行

咱们把索引创建好了之后,不需要手动使用,直接查询的时候就会自动的走索引,sql内部通过数据库的执行引擎来进行执行的,执行引擎会自动评估,哪种成本最低,速度最快~

5、索引的数据结构:B+树

索引的根本目的在于提高查找速度

1、B树的特点:每个数据在他的根节点上,比较次数虽然和二叉树相比没怎么减少(一个节点上可能需要比较多次),但是读写硬盘的次数减少了。(B树的每个节点都是在硬盘上的),但是b树还不够,我们就引入了B+树

2、B+树介绍:B+树也是N叉搜索树,但在这之上又有一些新的特点,B+树就是为了索引这个场景,量身制作的数据结构。

 特点:

(1)B+树也是一个N叉搜索树,每个节点上可能包含N个key,N个key划分出N个区间,最后一个key就相当于最大值。

(2)父元素的key会在子元素中重复出现,并且是以最大值的姿态出现的!

这样的重复出现,导致叶子节点就包含了所有数据的全集,非叶子节点中的所有值都会在叶子节点中体现出来!!!

(3)它会把叶子节点用类似链表的方式进行首尾相连~

这样通过类似链表的连接,就可以更有利于我们进行范围查询了!所有的查询,最后都是要落到叶子节点上的,无论查询哪个元素,中间比较的次数都差不多,查询操作比较均衡! 

(4)由于所有的key都会在叶子节点中体现,因此非叶子节点,不必存表的真实记录(不必存数据行),只需要把所有的数据行给放到叶子节点上即可,非叶子节点只需要存索引的值

(由于非叶子节点只存了简单id,没有存一整行,这就意味着非叶子节点,占用的空间是大大降低的,有可能在内存中可以放进去缓存,更进一步降低了硬盘的io,提高查询速度!!)

如果大家对数据库索引这方面还想进行更深入了解,可以看以下这本书。


二、事务

1、事务认识:

事务简单理解就是可以把sql给打包到一起,变成一个整体进行操作。

例如转账操作需要双方进行操作,需要让转账人进行-金额,使接收人进行+金额,如果有一个失误,就会出现问题,所以我们需要把他进行一个整形进行操作,同时进行。要么一起执行,要么都不执行。如果事务中间执行失误了,就让一条都不执行,但它并不是没有执行,而是遇到了错误回复到执行之前的样子,看起来好像没执行一样。

2、事务操作:

回滚(rollback):回滚就是把执行过的操作逆向恢复回去。

(数据库会把执行的每个操作记录下来,如果某个数据出错,就会把事务中前面的操作进行回滚,根据之前进行的操作,进行逆操作(前面是插入,现在就删除,前面是删除,现在就插入))。

开启事务:start transaction;

中间写sql语句

commit; (开启事务后,sql不会立即执行,而是攒着等commit一起执行,保证事务的原子性)

rollback  主动回滚事务。

3、事务四大特性:

(1)原子性

事务的初心

(2)一致性

事务执行前后,都得是合法的数据,不能出现失误情况。

(3)持久性

事务操作产生的修改都会写入到硬盘中,就算是关机了,数据一样存在硬盘中。

(4)隔离性

一个数据库服务器,同时执行多个事务的时候,事务之间的相互影响程度。

4、MySQL的隔离性

隔离性详解:mysql服务器如果要同时给多个用户提供服务,此时多个客户端之间,可能会同时发生事务,尤其是这多个事务同时操作同一个数据库的同一个表的时候,就可以有问题。

如果隔离性越高,就意味着事务之间的并发程度越低,执行效率越慢,但是数据的准确性越高。例如:算钱的时候,一定要数据准确

如果隔离性越低,就意味着事务之间的并发程度越高,执行效率越快,但是数据的准确性越低。例如:抖音、b站等的点赞数,需要执行速率快,但不需要太准确。

mysql提供了不同挡位(可以控制隔离性的高低、并发程度的高低、执行效率的高低、数据正确性的高低等)

不同程度遇到的不同问题:

1、脏读(dirty data):读脏数据,意思就是读到了有问题的数据,完全并发的情况下,没有任何限制就会出现脏读问题。

解决办法:降低并发现,提高隔离性,给写"加锁";

2、不可程度读:在一个事务操作中,连续两次读到的数据不一样,就是因为边读数据,边修改数据导致。

解决办法:进一步降低并发性,提高隔离性,给读"加锁";

3、幻读:在同一个事务中,两次读到的结果集不一样,在上面加锁的情况下,写不一样的内容,导致读到的情况不一样

解决问题:串行化,彻底舍弃并发性,实现完全隔离。

MySQL提供了四个隔离级别:

1、read uncommitted  不做任何限制,事务之间都是随意并发的,并发程度最高,隔离性最低,会出现脏读+不可重复读+幻读问题

2、read committed  给写加锁,并发程度降低,隔离性提高,解决了脏读问题,但会出现不可重复读+幻读问题

3、repeatable read  给写和读都加锁,并发程度又降低,隔离性又提高,解决了脏读+不可重复读问题,但会出现幻读问题。

4、serializable 严格串行化,并发程度最低,隔离性最高,解决了脏读+不可重复读+幻读问题,但执行速度时最慢的。

mysql就可以根据具体问题,来决定使用哪个隔离级别,通过mysql配置文件进行调整。


总结:

本篇博客重点在于对索引操作和事务操作的总结和归纳,篇幅又臭又长,但是对面试找工作有很大的帮助,所以我觉得有必要进行相关了解和归纳,希望本博主的内容能对你有用,谢谢!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WEB进销存管理系统源码带操作手册和源码安装说明文档

适用于大众化普通商品,包括鞋服、眼镜店等,前端使用js、html、css最基本的技术,后端使用sql、存储过程,前后端才有json交互,不依赖于任何第三方框架,简单易用易学,适合扩展。 源码类型&#…

Java十年功力还是涨不了薪,推荐必看《Java核心技术及面试指南》

很多程序员工作努力,但表现一般,导致面试失败或者涨不了薪资,在我看来,这种情况出现的原因有两个:一个是“盲人摸象,只知其一不知其二”,埋头做技术或者“CV工程师”,再做几年也没成…

JavaScript期末大作业 基于HTML+CSS+JavaScript技术制作web前端开发个人博客(48页)

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

MOSFET 和 IGBT 栅极驱动器电路的基本原理学习笔记(四)高侧非隔离栅极驱动

高侧非隔离栅极驱动 1.适用于P沟道的高侧驱动器 2.适用于N沟道的高侧直接驱动器 1.适用于P沟道的高侧驱动器 高侧非隔离栅极驱动可按照所驱动的器件类型或涉及的驱动电路类型来分类。相应地,无论是使用P沟道还是 N沟道器件,是实施直接驱动、电平位移驱…

项目设置统一返回结果对象

一、统一返回数据格式 项目中我们会将响应封装成json返回,一般我们会将所有接口的数据格式统一, 使前端(iOS,Android, Web)对数据的操作更一致、轻松。 一般情况下,统一返回数据格式没有固定的格式,只要能描述清楚返回的数据状态以…

十四、使用 Vue Router 开发单页应用(4)

本周概要 导航守卫 全局守卫路由独享的守卫组件内守卫导航解析流程 14.10 导航守卫 在 14.4 嵌套路由 小节中已经使用过一个组件内的导航守卫:beforeRouteUpdate 。Vue Router 提供的导航守卫主要用于在导航过程中重定向或取消路由,或添加权限验证、…

python基于用户画像和协同过滤实现电影推荐系统

1、概要 传统电影推荐系统大多使用协同过滤算法实现电影推荐,主要实现机理是通过用户评分及用户观影历史数据抽象为多维向量利用欧式距离或其他向量计算公式实现推荐,本文中将采用常用的机器学习算法Kmeans聚类算法协同过滤算法word2vec搜索推荐模型多模…

【猿如意】MySQL的下载、安装、使用,这一文足够了~

大家好,我是笑小枫,本篇文章为大家分享一个好用的工具-【猿如意】 对于这个工具呢,怎么说呢?简单点就是:不经意间回首,放眼望去,满眼是你~ 下面就已Mysql下载安装的过程来和大家一起体验下我们的…

【代码审计-.NET】基于.NET框架开发的代码审计

目录 一、审计方法 1、从黑盒到白盒 2、白盒审计 3、灰盒审计 二、审计过程 1、功能点追踪 2、功能函数 3、目录扫描 4、getshell 5、安全模块未引用 6、自动扫描工具 一、审计方法 1、从黑盒到白盒 --->从一个网站前端 --->查看其页面的源代码,并分…

【日常系列】LeetCode《20·数据结构设计》

数据规模->时间复杂度 <10^4 &#x1f62e;(n^2) <10^7:o(nlogn) <10^8:o(n) 10^8<:o(logn),o(1) 内容 lc 155 【剑指 30】【top100】&#xff1a;最小栈 https://leetcode.cn/problems/min-stack/ 提示&#xff1a; -2^31 < val < 2^31 - 1 pop、top 和…

快看梅西射门了,这是梅西的大力抽射~阿根廷加油,我们是冠军

&#x1f5b1; ⌨个人主页&#xff1a;Love And Program的个人主页 &#x1f496;&#x1f496;如果对你有帮助的话希望三连&#x1f4a8;&#x1f4a8;支持一下博主 来自梅西的大力抽射&#x1f970;致昨晚的梅西思路加入阿根廷元素加入足球元素源码致昨晚的梅西 昨晚上阿根廷…

springcloud 从头开始构建分布式微服务脚手架

必备服务&#xff08;Windows开发本机环境&#xff09; Java maven mysql&#xff1a;自启动服务&#xff0c;后台运行 127.0.0.1:3306 MySQL57 root/root Redis&#xff1a;手动运行&#xff0c;前台运行 127.0.0.1:6379 执行命令redis-server.exe redis.windows.conf na…

Weblogic漏洞 - 通杀方式

文章目录简介恶意文件把恶意文件部署到攻击机&#xff0c;并开启http服务写入文件写入反弹shell命令执行反弹shell命令拿到目标机器权限[linux] WebLogic Server 版本: 12.2.1.3简介 最早在 CVE-2019-2725 被提出&#xff0c;对于所有Weblogic版本均有效。 构造一个XML文件&…

CALC-python和shell对字符的解析差异

好久没看题了&#xff0c;记录一道感觉还挺有意思的题目 一进去题目界面非常简洁&#xff0c;一个计算器 这个简洁的界面&#xff0c;好像似曾相识&#xff0c;总感觉好像以前做题时遇到的ssti题目的界面&#xff0c;果断来一波ssti emem有WAF&#xff0c;尝试下绕过&#xff…

C++ 实现守护进程

文章目录1.守护进程概念1.什么是守护进程2.守护进程的特点3.如何查看linux系统中已存在的守护进程2.守护进程编写的步骤3.示例1.守护进程概念 1.什么是守护进程 Linux Deamon守护进程是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或者等待处理某些事…

系统小工具API接口,免费好用

1、前言 系统小工具接口&#xff0c;可生成长短不重复id&#xff0c;可获取服务器标准时间。 查看接口完整信息&#xff1a;https://www.idmayi.com/doc/detail?id23 2、接口明细 注意&#xff1a;app_id和app_secret是临时秘钥&#xff0c;如果真正使用&#xff0c;需要去 ht…

ArrayList源码解析

ArrayList源码解析 简介 ArrayList 是一种以数组实现的 List&#xff0c;与数组相比&#xff0c;它具有动态扩展的能力&#xff0c;因此也可称之为动态数组。 ArrayList 线程不安全&#xff0c;除该类未实现同步外&#xff0c;其余跟 Vector 大致相同。 Java 泛型只是编译器…

赛先生的新旅行:昇腾AI带来的科学智能变革

《三体》动画即将开播&#xff0c;又一次引发了全球科幻迷的无限热情。提到《三体》&#xff0c;大家有很多深刻记忆。其中之一是三体人在入侵地球之前&#xff0c;首先是派智子锁死地球的基础科学进步&#xff0c;从而限制人类的整体发展。很多人会担心&#xff0c;物理、化学…

LeetCode题解12 (146,97) LRU缓存<HashMap + 双向链表>,二叉树的中序遍历

文章目录LRU缓存(146)完整代码解答:二叉树的中序遍历(94)完整代码解答:LRU缓存(146) 从题上看存在Key和Value因此我们采用HashMap来进行存储,这里我们采用HashMap双向链表来实现,我们需要实现里面的get,put方法。 我们需要先创建1个链表节点 //先定义一个节点类 class ListNode…

一个合格的程序员也是一名合格的侦探---Debug篇

调试 文章目录调试1.什么是bug&#xff1f;1.1bug概念1.2bug的起源2.什么是调试&#xff0c;调试的重要性2.1调式的概念2.2 调试的基本步骤2.3Debug版本和Release版本2.3.1Debug版本2.3.2Release版本2.3.3区别2.3.4同一代码在Debug和Release下的差别3.Windows下visual stdio的调…