【MySQL】索引与事务

作者主页:paper jie_博客

本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。

本文录入于《MySQL》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精力)打造,将MySQL基础知识一网打尽,希望可以帮到读者们哦。

其他专栏:《算法详解》《C语言》《javaSE》《数据结构》等

内容分享:本期将会分享MySQL表的索引与事务

目录

索引

什么是索引

作用

索引的使用

查看索引

创建索引

 删除索引

索引的利弊与场景使用

*索引使用的数据结构*

B树

B+树

事务

什么是事务

为什么要有事务

事务的使用

*事务的特性*

原子性

一致性

持久性

*隔离性*

经典bug1: 脏读

经典bug2: 不可重复读

经典bug3: 幻读

注意


索引

什么是索引

索引是一种特殊的文件,包含对数据表中所有记录的引用指针.可以对表中的一列或多列创建索引,还可以指定索引,个类索引都会有各自的数据结构来实现

作用

数据库中的表,数据,索引他们的关系就是字典,字典中的字,字典的目录关系

索引所起到的作用就是帮助数据快速定位,检索数据

索引对于提高数据库查找的性能有很大的帮助

索引的使用

这里,我们要知道, 创建一些约束,如:primary key, unique, foreign key 时,会自动创建索引.

查看索引

show index from 表名;

栗子:

mysql> show index from student;
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table   | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| student |          0 | PRIMARY  |            1 | id          | A         |           8 |     NULL | NULL   |      | BTREE      |         |               |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

创建索引

对于非主键,唯一约束,外键的字段,可以创建普通索引

create index 索引名 on 表名(字段);

栗子:

mysql> show index from course2;
Empty set (0.00 sec)

mysql> create index idx_id on course2(id);
Query OK, 0 rows affected (0.05 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show index from course2;
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table   | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| course2 |          1 | idx_id   |            1 | id          | A         |           3 |     NULL | NULL   | YES  | BTREE      |         |               |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

 删除索引

drop index 索引名 on 表名;

栗子:

mysql> drop index idx_id on course2;
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

索引的利弊与场景使用

索引它也不是完全有利的,索引是一种数据结构,它也会占一定的磁盘空间,有额外的开销.且在改动数据的时候,索引也需要更新,这也会占用一定的时间开销.所以我们在使用索引的时候需要考虑以下几点:

1. 数据量较大,且经常对这些列进行查询

2. 该数据库中的数据修改或新增操作频率低

3. 索引会占据额外的磁盘空间

*索引使用的数据结构*

在数据库中,索引使用的数据结构是B+树,而B+树是有B树演变过来的

B树

特点:

B树它是一个N叉搜索树

 它的节点上的值是有序的

假设一个节点上有N个key,这N个值又会划分出N+1个区间

好处:

它树的高度比二叉搜索树降低了很多

在使用B树查询的时候,一个结点比较的次数虽然多了,但同一个节点的key只需要一次硬盘IO,而比较又是在内存中进行,速度就快了不少

B树图形:

B+树

特点:

是在B树基础上改动,仍然是N叉搜索树,仍然是有序的

假设一个节点上有N个key值,则N个值有N个区间

且每一个节点的最大值会重复出现在子结点中

叶子节点使用了链表将它们串起来

好处:

叶子节点存有数据的全集,比如查询id >=4 and id<= 10,需要从根节点开始一直找到叶子节点的4,然后开始沿着链表遍历到10.就不需要回溯了

针对B树的查询时间是稳定的.查询任何数据都是需要从根结点查询到叶子节点的,过程中的IO是一样的

使用B+树结构,就只需要在叶子节点存储数据集,其他节点存储比较的值就行,这要会节约大量的空间

B+树图形:

事务

什么是事务

事务就是指逻辑上的一组操作,将这组操作捆绑在一起,要么全部失败,要么全部成功.在不同的环境中,都会有事务.数据库中对应的就是数据库事务.

为什么要有事务

这很好理解,这里举一栗子:

小明有2000块钱,小花有1000块钱.小明这时需要向小花转账500块钱,小花需要接受500块钱,对应的MySQL语句就是:

updata user set money = money - 500 where name = '小明';
updata user set money = money + 500 where name = '小花';

这时第一条语句执行了,但是在执行第二条语句前服务器挂了.这时就会发生: 小明的账号少了500,而小花的账号却没有多500块,这钱就不翼而飞了.

因此就需要事务来控制这些语句,要是都执行,要么都失败.

事务的使用

1. 开始事务: start transaction

2. 执行多条sql语句

3. 回滚或提交: rollback / commit

这里rollback是全部失败, commit是全部成功

*事务的特性*

原子性

通过事务,将多个操作打包到一起.(失败都失败,成功都成功)

一致性

相当于原子性的延续,数据库中出了问题,就不会出现上面"钱消失了"的情况

持久性

事务的修改,都是会写入硬盘的,不管是电脑关机还是重启系统丢不会丢失

*隔离性*

多个事务并发执行的时候就会带来一些问题.这里就可以通过隔离性来对这里的问题进行处理~(这里就需要看你是更加注重准确还是速度快)

这里有几个经典的bug:

经典bug1: 脏读

当有两个事务1,2. 事务1在修改某个数据,但是还没有提交. 事务2读取到了这个数据,结果事务1后序又修改了这个数据. 这就是一个脏的数据.(因为一个事务里有多条操作,可以多次修改). 

这时我们就需要通过给操作加锁来解决问题.(核心就是降低并发程度)

这就好比上厕所把门锁了,别人就看不到你上厕所了

经典bug2: 不可重复读

有事务1,2. 事务1先修改数据(这里加锁了), 此时事务2想读这个数据,就需要等事务1提交. 等事务1提交后,事务2就开始读数据(这里事务2会多次读取这个数据),结果后面来了一个事务3有修改了这个数据,这就导致事务2在读的过程中两次读到的结果不一样.这就是写加锁了,但是读没加锁.所以就出现了读数据的时候事务3又写了.

这就好比在淘宝上买东西第一遍我们看到的20块钱,结果在付钱的时候看到的是40块钱.

解决方式就是给读也加锁~

经典bug3: 幻读

事务1,2 事务1修改数据,提交. 事务2开始读数据,这时事务3新增了其他的数据,此时事务2读出来的结果集就不同了

这就好比在使用count()聚合函数一样,第一次是5,第二个是10

解决方式就是:串行化,不再进行任何的并发

注意

以上这几种是否是bug其实还是看情况而定,根据需要的是准确性还是速度而定~


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

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

相关文章

前端Vue拖拽功能

文章目录 安装使用 直接复制粘贴即可页面使用 直接复制粘贴即可小结&#xff08;带有效果图&#xff09; 安装 提示&#xff1a;首先您需要安装它&#xff0c;命令如下&#xff1a; npm install awe-dnd --save使用 直接复制粘贴即可 在mian.js文件中引入 //main.jsimport V…

【数据库】数据库连接池导致系统吞吐量上不去-复盘

在实际的开发中&#xff0c;我们会使用数据库连接池&#xff0c;但是如果不能很好的理解其中的含义&#xff0c;那么就可以出现生产事故。 HikariPool-1 - Connection is not available, request timed out after 30001ms.当系统的调用量上去&#xff0c;就出现大量这样的连接…

市级奖项+1,持安获「创业北京」创业创新大赛优秀奖!

2274个创业项目参赛 历经五个多月的激烈角逐 第六届“创业北京”创业创新大赛 终于圆满落下帷幕 持安科技在北京市总决赛中再创佳绩&#xff01; 荣获制造业赛道优秀奖 本次大赛由北京市人力资源和社会保障局、北京市发展和改革委员会等11家单位联合主办&#xff0c;以“创…

代码示例:基于JAX-WS和JAXB,其中http请求和响应的报文体都是xml数据

说明 基于JAX-WS编写了RESTful的web服务端点。 http请求和响应的报文体都是xml数据&#xff0c;服务端分别对应了用JAXB注解的请求和响应类。 只实现了服务端的代码示例 客户端使用了Postman 示例 要实现的目标&#xff1a;http请求和响应报文体的xml数据 http请求报文体的…

c语言免杀火绒

文章目录 前记c加载器补充知识 前记 pyinstaller pyinstaller目前已经被杀疯了&#xff0c;简单打包一个hello a"hello" print(a)#pyinstaller -F -w b.py -n HipsMain.exe考虑Nuitka pip uninstall nuitka pip install nuitka pip install nuitka1.8.5 这里最新…

【2】SM2验签工具和RSA验签工具

0X01 前言 最近看了好多验签工具&#xff0c;感觉不是很好用&#xff0c;就自己造了个。 0x02 工具功能介绍 对SM2算法进行验签和RSA算分进行验签&#xff0c;签名值可以是base64&#xff0c;也可以是十六进制。 兼容各种输入。 0x03 工具使用 RSA 验签 SM2 验签 0x04 工具…

架构师篇 DDD领域驱动设计篇

一 DDD领域驱动设计 1.1 领域驱动设计 领域驱动设计(英文&#xff1a;Domain-Driven Design&#xff0c;缩写DDD)是一种模型驱动设计的方法&#xff0c;领域驱动设计常以战略设计与战术设计来将整个领域展现的淋漓尽致&#xff0c;其作用范围既面向业务也面向技术。从战略角度…

『GitHub项目圈选02』一款可实现视频自动翻译配音为其他语言的开源项目

&#x1f525;&#x1f525;&#x1f525;本周GitHub项目圈选****: 主要包含视频翻译、正则填字游戏、敏感词检测、聊天机器人框架、AI 换脸、分布式数据集成平台等热点项目。 1、pyvideotrans pyvideotrans 是一个视频翻译工具&#xff0c;可将一种语言的视频翻译为另一种语…

完整版解答!2023年数维杯国际大学生数学建模挑战赛B题

B题完整版全部5问&#xff0c;问题解答、代码&#xff0c;完整论文、模型的建立和求解、各种图表代码已更新&#xff01; 大家好&#xff0c;目前已完成2023数维杯国际赛B题全部5问的代码和完整论文已更新&#xff0c;部分展示如下&#xff1a; 部分解答图表 问题分析 B题前三…

打不开github网页解决方法

问题&#xff1a; 1、composer更新包总是失败 2、github打不开&#xff0c;访问不了 解决方法&#xff1a;下载一个Watt Toolkit工具&#xff0c;勾选上&#xff0c;一键加速就可以打开了。 下载步骤&#xff1a; 1、打开网址&#xff1a; Watt Toolkit 2、点击【下载wind…

ROS 学习应用篇(八)ROS中的坐标变换管理之tf广播与监听的编程实现

偶吼吼胜利在望&#xff0c;冲冲冲 老规矩新建功能包 工作空间目录下/src下开启终端输入 catkin_create_pkg learning_tf roscpp rospy tf turtlesim 如何实现tf广播 引入库 c python …

基于猕猴感觉运动皮层Spike信号的运动解码分析不同运动参数对解码的影响

公开数据集中文版详细描述参考前文&#xff1a;https://editor.csdn.net/md/?not_checkout1&spm1011.2124.3001.6192神经元Spike信号分析参考前文&#xff1a;https://blog.csdn.net/qq_43811536/article/details/134359566?spm1001.2014.3001.5501神经元运动调制分析参考…

开源简历生成器OpenResume

什么是 OpenResume &#xff1f; OpenResume 是一个功能强大的开源简历生成器和简历解析器。OpenResume 的目标是为每个人提供免费的现代专业简历设计&#xff0c;让任何人都能充满信心地申请工作。 OpenResume 有 5 个核心特点&#xff1a; 特征描述1. 实时UI更新当您输入简历…

如何去掉图片上的水印?这三种去水印的方法帮你解决!

当我们从网上看到喜欢的图片&#xff0c;想要保存下来作为头像或者插入到工作汇报中时&#xff0c;却发现下载的图片带有水印。这不仅影响了图片的美观&#xff0c;还可能对图片的可用性造成影响。那么&#xff0c;如何去掉图片上的水印呢? 实际上&#xff0c;现在市面上的很多…

【项目管理】PMO技能树21项参照

导读&#xff1a;PMO技能树让你能够有全局视野&#xff0c;让你对照着检查自己的能力是否掌握。技能树提供了构建个人知识体系参照和地图导航&#xff0c;不至于迷失方向。 目录 1、PMO层次概览 2、技能树 2.1 项目管理流程 2.2 项目组合管理 2.3 风险管理 2.4 项目资源管…

高品质建筑红模板与耐久黑色覆膜清水模板:建筑质量的双重守护者

高品质建筑红模板&#xff0c;是现代建筑领域中不可或缺的利器。其承载着创新设计与高效施工的双重使命&#xff0c;在工地建筑需求中占据着重要地位。而耐用黑色覆膜清水模板&#xff0c;则是建筑领域中的隐形英雄&#xff0c;为建筑结构提供了可靠的支撑和保护。这两者的结合…

maptalks三维地图网址

三维 地址: http://examples.maptalks.com/examples/cn/gltf/gltf-marker/shader

typora使用PicGo自动上传图片到chevereto图床

typora使用PicGo自动上传图片到chevereto图床 近期发现&#xff0c;gitee图床不能用了。github又涉及科学上网。搜索了开源图床方案&#xff0c;找到了chevereto&#xff0c;使用起来还不错。分享给大家。 文章目录 typora使用PicGo自动上传图片到chevereto图床chevereto图床安…

产品经理必备技能:如何快速锁定种子用户群体?

大家好&#xff0c;我是小米&#xff0c;一名热爱技术、热衷分享的90后小青年。今天我们要探讨的话题是一个在产品经理面试中经常被问到的问题&#xff1a;“产品上线后的种子用户该如何获取&#xff1f;”作为一个热爱挑战、乐于探讨的小伙伴&#xff0c;我将和大家分享一些我…

开源与闭源:创新与安全的平衡

目录 一、开源和闭源的优劣势比较 一、开源软件的优劣势 优势 劣势 二、闭源软件的优劣势 优势 劣势 二、开源和闭源对大模型技术发展的影响 一、机器学习领域 二、自然语言处理领域 三、数据共享、算法创新与业务拓展的差异 三、开源与闭源的商业模式比较 一、盈…