MySql索引和事务定义到使用全面涵盖
作者:菜菜不恰菜 发布时间:2024-01-21 02:39:48
索引是什么
索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引,并指定索引的类型,各类索引有各自的数据结构实现。索引就相当于一本书的目录,通过索引 可快速定位、检索数据。使用索引大大提高了查找效率,但同时索引也占用了更多的空间,拖慢了增删改的速度。
索引的使用场景
1、数据量较大,且经常对这些列进行条件查询。
2、该数据库表的插入操作,及对这些列的修改操作频率较低。
3、索引会占用额外的磁盘空间。
满足以上条件时,考虑对表中的这些字段创建索引,以提高查询效率。
反之,如果非条件查询列,或经常做插入、修改操作,或磁盘空间不足时,不考虑创建索引。
索引的常见操作
1、创建索引 对于非主键、非唯一约束、非外键的字段,可以创建普通索引。
create index 索引名 on 表名(字段名);
2、查看索引
show index from 表名;
3、删除索引
drop index 索引名 on 表名;
索引背后的数据结构
索引背后的数据结构是B+树。
B+树优势:
1、使用B+树进行查找的时候整体的磁盘IO次数是比较少的。
2、所有的查询最终都会落到叶子节点上,每次查询的磁盘IO次数都是差不多的,查询速度比较稳定。
3、叶子结点用链表连接之后,非常适合进行范围查找。
4、所有的数据存储(载荷)都是放到叶子节点上的,非叶子节点中只保存key值即可,因此非叶子节点整体占用的空间较小,甚至可以缓存到内存中(一旦能够全部放内存里,这时候磁盘IO几乎没了)。
事务是什么
事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。 在不同的环境中,都可以有事务。对应在数据库中,就是数据库事务。就是说两个操作要么都执行,要么一个都不执行。 就比如说现在有A、B两个账户,两个账户上都有1000元,现在A要给B转500元,那么A账户上就要少500元,B账户上要多500,两个操作都要执行。不能存在一个执行一个不执行,要么都不执行。 在sql中,如果第一个sql执行之后,第二个sql执行时出现意外,导致不能执行,这时候数据库就会还原操作,让第一个sql还原到执行之前(回滚)。那么数据库是怎么还原的呢?是因为数据库会将执行过的每个操作都记录下来。
⭐ 事务的相关操作
1、开启事务
start transaction;
2、回滚或提交
rollback/commit;
//rollback即是全部失败,commit即是全部成功。
事务的基本特性
1、原子性
原子性是指两个操作要么全部都执行,要么一个都不执行,操作不可再细分了。
2、一致性
一致性是指数据库的数据在事务执行之前和之后都要是合理合法的。(例如上面的转账,账户不能出现负数的情况)
3、持久性
持久性是指事务一旦被提交之后,数据就被写入硬盘,持久化的存储起来了。
4、隔离性
隔离性是指事务并发执行时产生的情况。
事务并发执行是指多个事务同时执行,多个事务并发执行时,尤其时多个事务在尝试修改、读取同一份数据时,很容易出现一些问题,隔离性就是在处理这些问题。
⭐并发执行事务可能带来的问题:
1、脏读问题
事务A正在输入某些数据,这是事务B过来读取了事务A正在输入的数据,然后B回去按照A的数据进行输入,若事务A在事务B读取数据之后对数据进行了修改,这时候事务B读到的数据就有可能是一个"脏数据"(这个数据只是一个临时的的结果,而不是最终结果),这就是脏读问题。
如何处理脏读问题?
在写数据的时候进行加锁处理,等A完全写完修改完之后再让B看,这时候事务之间的隔离性就提高了,但同时并发性也降低了。
2、不可重复读问题
按照以上处理,等到A全部写完B再看,但是如果A在B读的时候又修改了代码,这时候B再回过头来看,数据又不一样了,不能重复读这个数据,这怎么办?这时候干脆就将读也加上锁,在A写入数据的时候B不能读,在B读数据的时候A也不能修改。这时候事务的隔离性又提高了,并发性又降低了。
3、幻读问题
以上两个操作,给读和写都加上了锁,虽然它的隔离性提高了,但是却降低了效率,导致读和写的时间都变得更长了起来,这时候在写或者读的过程事务可以去改其他表或者这个表的其他行(事务虽然在提交隔离性时进行了一系列的加锁,但是并没有把整个数据库给锁定了),这时候B在读数据的时候会发现数据数量变了,本来只有一个A.java,现在又多了个B.java,这就是幻读问题。总的来说就是一个事务执行过程中进行多次查询,每次查询的结果集不一样(多或者少),这也是一种特殊的不可重复读问题。
该如何解决呢?
事务串行化执行。(串行化执行就是事务一个一个执行)
通过以上我们也知道了隔离性和并发性不能同时得到,要想提高隔离性,并发性就得降低。
进行了以上修改,这时候隔离性程度最高,并发性程度最低,数据最可靠,速度也最慢。
⭐根据以上总结,MySQL中事务的隔离级别,提供了以下这几种:
1. read uncommitted:允许读取未提交的数据,并发程度最高,隔离程度最低,会引入脏读、不可重复读、幻读问题。
2. read committed:只允许读取提交之后的数据,相当于写加锁,并发程度降低了一些,隔离程度提高了一些, 解决了脏读,会引入不可重复读和幻读。
3. repeatable read:相当于给读和写都加锁,并发程度又降低了,隔离程度又提高了,解决了脏读和不可重复度,会引入幻读。
4. serializable:串行化,并发程度最低(串行执行),隔离程度最高,解决了脏读,不可重复度,幻读问题,但是执行速度最慢。
小结
这里主要掌握索引是什么,它的适用场景,付出了什么代价以及索引背后的数据结构,事务的四个基本特性。
来源:https://blog.csdn.net/m0_65673419/article/details/125410601


猜你喜欢
- 在公司的工作经常要为客户作产品展示的页面,由于客户上传的图片格式大小不一,缩放后会导致变形,于是在星期天抽了点时间,写了一段JS代码,支持图
- 在 Python 中,一般情况下我们可能直接用自带的 logging 模块来记录日志,包括我之前的时候也是一样。在使用时我们需要配置一些 H
- 上次看到别人说写一个类似支付宝支付密码的输入框效果,今天就想自己写了试试看,大体功能是实现了。已实现部分: 1. 焦点会随着输入数值往后推移
- 关于正则表达式raw的\匹配规则这是我在学习中获得到的一个例子,第一表达式中匹配到的是none。于是乎我就在思考,为什么会匹配不到,假设\t
- 图片太大了,上百张图用photoshop改太慢,就想到用python写个简单的批处理。功能简单就是把原图按比例缩小# -*- coding:
- 我最近花了一些时间在探索CPython,并且我想要在这里分享我的一些冒险经历。Allison Kaptur的excellent guide
- 思路:利用time函数返回的时间字符串与指定时间字符串做比较,相等的时候执行对应的操作。不知道大家的思路是什么,感觉这样比较耗CPU。。。。
- Deferred对象结构Deferred由一系列成对的回调链组成,每一对都包含一个用于处理成功的回调(callbacks)和一个用于处理错误
- 代理服务是一种复杂的技术,具有很多可配置的移动组件。详细信息如下:信息信息是指在服务代理应用程序中调用的基本信息单元。对于服务代理来说,信息
- 第一次打包vue的项目部署到服务器下时,发现初次加载特别的缓慢,将近20s页面才加载出来,完全没有开发环境上的那么流畅。主要原因是页面在打包
- 主要能兼容: PHP 5 一、chdir -- 改变目录 语法:bool chdir&nb
- YAML语法规则:http://www.ibm.com/developerworks/cn/xml/x-cn-yamlintro/下载PyY
- 抽象工厂模式(Abstact Factory)是一种常见的软件设计模式。该模式为一个产品族提供了统一的创建接口。当需要这个产品族的某一系列的
- 本文实例讲述了python计算时间差的方法。分享给大家供大家参考。具体分析如下:1、问题:给定你两个日期,如何计算这两个日期之间间隔几天,几
- 1 HSV上下限颜色的HSV上下限如下表:2 追踪单个颜色import cv2 as cvimport numpy as npcap = c
- 如何用数据库制作一个多用户版的计数器?代码和说明如下:count.asp' 计数器的核心程序<%Set c
- 先说结论:变量赋值属于浅拷贝(关于深拷贝和浅拷贝的区别可以自己了解下)。故如果是可变类型变量(如a是list类型,a=b)赋值,修改a会牵连
- 在学习Python爬虫的时候,经常会遇见所要爬取的网站采取了反爬取技术,高强度、高效率地爬取网页信息常常会给网站服务器带来巨大压力,所以同一
- 大家都知道Js有同源策略,就是主域名不同嵌套的iframe不允许Js通信的。比如我有一个网站,网站中要嵌入其网站的页面。那么我可
- 在实际开发中经常需要对前端传递的多个参数进行不为空校验,可以使用python提供的all()函数if not all([arg1, arg2