MySQL事务和索引

news2024/11/16 15:59:43

✏️作者:银河罐头
📋系列专栏:MySQL

🌲“种一棵树最好的时间是十年前,其次是现在”

目录

  • 索引
    • 概念
    • 使用
    • 索引在MySQL中的数据结构
  • 事务
    • 概念
    • mysql的隔离级别

索引

概念

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

索引相当于书的目录,可以提高查的速度。但是索引也提高了增删改的开销,因为进行增删改会需要调整已经创建好的索引目录,降低增删改的速度。索引还提高了空间的开销。

增删改中包含查,总体来看查的频率高于增删改,所以索引对于提高数据库的性能有很大的帮助。

使用

学生表里没有创建索引但是自带一个索引

image-20221115215549671

因为主键要保证非空且不重复,所以每次插入数据都要检查是否已经存在,有索引可以提高查找速度。

unique和foreign key也会自动创建索引

  • 创建索引

    image-20221116113806596

    根据名字这一列来创建索引

    创建索引,最好是在创建表的时候就创建索引。如果在表已经有很多记录的时候再创建索引是危险操作(会消耗大量的磁盘IO,花很长时间,在这个时间段里数据库无法正常使用)。

    如果对性别或者大学生的年龄这样的列创建索引,这样无法提高查找速度,因为太多重复。

  • 查看索引

image-20221116112344054

  • 删除索引

    image-20221116113603543

    删除索引也可能消耗大量的磁盘IO

    SQL是通过数据库的执行引擎来执行的,涉及一些优化操作。执行引擎会自动评估哪种方案是成本最低速度最快的。

    可以使用explain关键字显示出查询过程中具体使用索引的情况。

索引在MySQL中的数据结构

哈希表查找元素时间复杂度是O(1),但是哈希表不适合做数据库的索引。原因是哈希表只能比较两个元素是否相等,不能进行’>‘、’<'这样的范围查询

二叉搜索树的时间复杂度是O(1),AVL/红黑树的时间复杂度是O(img)

(二叉意味着元素个数越多,树的高度越高,查询时元素的比较次数越多,数据库进行比较是要读硬盘的。)

  • N叉搜索树:每个节点上有多个值,同时有多个分叉,树的高度就降低了。

其中一种典型代表是B树

image-20221116145722691

比较次数没有减少,一个节点上可能需要比较多次,但是读写硬盘的次数减少了,每个节点都保存在硬盘上。(读硬盘比读内存要慢几千倍)

对B树做进一步的改进,又引入了B+树

索引的数据结构就是B+树

image-20221116152326551

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

2.父元素的key会在子元素中以最大值形式重复出现。(这样一来叶子节点就包含了所有数据的全集)

3.会把叶子节点用类似链表的方式首尾相连

B+树的优点:

1.作为一个N叉搜索树,高度降低使得读硬盘IO次数减少(这一点同B树)

2.更适合做范围查询

3.所有的查询都要落在叶子节点上,无论查询哪个元素,查询的比较次数很均衡

4.由于所有的key都会在叶子结点上体现,所以非叶子节点上不用存表的真实记录(不必存数据行),只需要把所有数据行放在叶子结点上即可,非叶子结点只用存索引列的值(比如id)。

由于非叶子结点只存了索引列的值,没有存数据行,这样意味着叶子节点占用的空间大大降低,有可能放进内存中缓存,这样进一步降低了硬盘IO

  • 提高查询速度,本质上是降低硬盘IO次数

有的表不只是主键索引,还有别的非主键列也有索引(比如前面的把name作为索引)。

这种情况会构造另外一棵B+树,这个B+树非叶子节点存这个索引列里的Key(比如一些name)。到了叶子节点这一层,存的不是完整的数据行,而是存主键id。

使用主键列来查询,只要查一次B+树就可以。

使用非主键列的索引来查询,就要先查询索引列的B+树,再查一遍主键列的B+树。

“再查一遍"这个操作是"回表”。

当前B+树这个结构,只是针对MySQL的InnoDB(最主流使用的一种存储引擎)这个数据库引擎 里面典型使用的数据结构。不同的数据库,不同的引擎,里面存储数据的数据结构还可能存在差异。

数据库的存储引擎,其实就是实现了数据库如何在硬盘上组织数据。

在这里插入图片描述

事务

概念

事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。

事务的四大特性:原子性、一致性、持久性、隔离性

举例1:转账

1)给1的余额-100

2)给2的余额+100

举例2:下订单

1)商品库存-1

2)订单表+1

这些操作是要么全部成功,要么全部失败(执行中途出错的情况)。

  • 原子性:把所有操作打包成一个整体

执行中间出错了,就让一条都不执行,意思是恢复成执行之前的样子,看起来像是一条都没执行。

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

数据库会把执行的每步操作都记录下来,如果某个操作出错就会把事务中前面的操作进行回滚,根据之前进行的操作进行逆操作。

这些操作有很大开销,不可能无限保存,最多是把正在执行的这个事务保存。

image-20221116164425684

开启事务之后,中间这些sql不会被立刻执行,而是先攒着,等commit再一起执行。(原子性)

  • 一致性

事务执行前/后数据都是合法状态。

  • 持久性

硬盘断电数据不丢失,事务产生的修改都会写入硬盘。即使程序重启/主机重启/掉电,事务都可以正常工作,保证修改是持久生效的。

  • 隔离性

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

一个服务器可以同时给多个客户端提供服务,这多个客户端彼此之间是一个"并发执行"的关系

如果隔离性越高,就意味着事务之间的并发程度越低,执行效率越慢,数据准确性越高;

如果隔离性越低,就意味着事务之间的并发程度越高,执行效率越快,数据准确性越低。

mysql的隔离级别

  • “脏读”

事例:假设张三在写一份文件,李四在旁边看,此时张三的写操作和李四的读操作是2个事务,是完全并发的,没有任何限制。等李四走了张三把文件内容改了,那么李四读到的就是错误数据,这就是"脏读"。

解决"脏读"问题就要提高隔离性,降低并发性,具体来说就是给这里的写操作加锁。张三写文件时加锁,写文件过程中李四不能读,等张三写完了之后李四才可以看。整体上花的时间更多了,李四读到的数据准确性提高了。

  • 不可重复读

事例:有了"写加锁",等张三写完文件之后,李四再读文件,而在李四读文件过程中,张三又修改了文件内容,此时李四读文件读了一半发现文件内容自动变了。

在一个事物中,连续两次读到的数据不一致,这就是"不可重复读"

解决:给"读操作"也加锁,李四读文件的时候张三不得修改。

这样使得这两个事务的并发程度进一步降低,隔离性进一步提高,执行效率进一步降低,数据准确性进一步提高

  • 幻读

事例:李四读文件时,张三不能修改李四正在读的那份文件,但是张三去新增/删除另外的文件,导致李四发现他读的文件内容没变,但是他发现文件的数量变了。

在同一个事务中,两次读到的结果集不同。这就是"幻读"

解决:串行化,彻底舍弃并发。李四读文件时,张三什么都不能做。

MySQL提供了4个隔离级别

隔离级别描述脏读不可重复读幻读
read uncommitted不做任何限制,事物之间可以随意并发执行。并发程度最高,隔离程度最低。
read committed对写操作加锁,并发程度降低,隔离性提高
repeatable read(默认档位)对写和读都加锁,并发程度进一步降低,隔离性进一步提高。
serializable严格串行化,并发程度最低,隔离性最高,执行速度最慢

通过mysql的配置文件来调整隔离级别

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

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

相关文章

一图看懂,阿里云飞天企业版如何支持政企数智创新

杭州&#xff0c;2022年11月5日 – 今日&#xff0c;在云栖大会专有云技术和应用实践论坛&#xff0c;阿里云重磅发布飞天企业版在建云、管云、用云方面的全面升级&#xff0c;并邀请行业专家、政企客户代表和合作伙伴面向未来十年共话新一代政企IT发展趋势&#xff0c;分享阿里…

行业洞察 | AI贩卖的焦虑,我们该买单吗?

图片来源Midjourney Showcase 在过去的几个月里&#xff0c;人工智能生成的艺术在受欢迎程度和可访问性方面都经历了快速增长。随着DALL-E、Midjourney和Stable Diffusion等引擎刺激了 AI 生成的艺术品在在线平台上的大量涌入。 此前&#xff0c;一位美国39岁游戏设计师&#…

测试行业3年经验,面试想拿 15K,HR说你只值 7K,该如何回答或者反驳?

面试最尴尬的不是被拒绝&#xff0c;而是直接说你不值那个价格... 最近朋友在面试的时候&#xff0c;HR 突然来了句&#xff1a;你只值 7K。朋友后面和我说了这个事。我想如果是我处在这种情况下&#xff0c;自己并不能很好地回答或者反驳。不知道大家会怎么回答或者反驳&…

深入浅出了解MYSQL8特性注入是什么

前言 今天给大家带来的是MYSQL8版本的特性注入&#xff0c;说起SQL注入大家一定不陌生&#xff0c;可是你有没有想过&#xff0c;当SQL注入中最关键的函数SELECT被过滤后&#xff0c;我们要如何去执行SQL语句呢&#xff0c;这就是本文要讲的内容&#xff0c;即利用MYSQL8版本的…

智慧人社解决方案-最新全套文件

智慧人社解决方案-最新全套文件一、建设背景二、思路架构三、建设方案1、全局性数据整合2、综合数据分析平台3、一体化数据管控四、获取 - 智慧人社全套最新解决方案合集一、建设背景 智慧人社平台以建设智慧大社保服务体系为目标&#xff0c;全面践行“互联网&#xff0b;人社…

python基于PHP+MySQL的大学生交友社交网站

近年来,大学生的数量在逐步的增加,为了能够让这些大学生有一个更好的交友环境,需要创建一个基于大学生的社交交友网站。这样可以拉近彼此大学生之间的感情,让他们可以更好的进行学习和交流。 PHP大学生交友社交网站通过PHP&#xff1a;MySQL进行开发,分为前台和后台两部分,通过…

[附源码]SSM计算机毕业设计餐厅卫生安全系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

mariadb10.8 主主同步 相互复制

1. 配置说明 操作系统&#xff1a;CentOS7 CPU指令集&#xff1a;x86_64 host1 主机&#xff1a; 2 core 2G 40GIP&#xff1a;192.168.0.98 host2 主机&#xff1a; 2 core 2G 40GIP&#xff1a;192.168.0.166 2. 数据库安装 见 MariaDB官方下载文档 https://mariadb.or…

mysql“数据不存在插入,存在则更新”实现

参考文章:Mysql:如果数据存在则更新&#xff0c;不存在则插入 场景 工作中有遇到需要配置一些指定的字段数据&#xff0c;但数据量大&#xff0c;不清楚之前是否有配置过&#xff0c;正确的思路应该是如果有这条数据了&#xff0c;那么更新数据的值&#xff0c;如果没有这条数…

股票行情接口level2的盘口信息和level1有哪些区别?

普通的行情接口软件会有价格曲线、五档盘口、分时成交等等这些行情数据&#xff0c;但是股票行情接口level2所能够提供的行情数据远远不止这些&#xff0c;level2顾名思义其实就是level1的高配版&#xff0c;那么它包含的数据相对于比普通行情接口的会更精细也更丰富&#xff0…

华为 x 香格里拉集团|品质网络守护数字旅程

作者 | 曾响铃 文 | 响铃说 酒店行业正在快速推动数字化&#xff0c;其目标是对内提升酒店管理效率&#xff0c;对外提升宾客入住体验&#xff1b;而网络作为整个数字化变革的联接底座&#xff0c;迫切需要进行升级和优化。以香格里拉集团为例&#xff0c;作为成立超过半个世…

微信怎么使用手机号码收款转账?

微信怎么使用手机号码收款&#xff1f; 1、微信手机号码收款方&#xff0c;打开微信钱包&#xff0c;并点击钱包进入&#xff1b; 2、在微信钱包找到支付设置&#xff0c;并点击进入支付设置&#xff1b; 3、在微信钱包支付设置内&#xff0c;开启允许通过手机号向我转账&…

力荐,京东首席架构师:亿级流量架构的核心技术文档免费分享

学习是一种基础性的能力。然而&#xff0c;“吾生也有涯&#xff0c;而知也无涯。”&#xff0c;如果学习不注意方法&#xff0c;则会“以有涯随无涯&#xff0c;殆矣”。 学习就像吃饭睡觉一样&#xff0c;是人的一种本能&#xff0c;人人都有学习的能力。我们在刚出生的时候…

大厂敲门砖,在阿里工作十年的朋友,总结出这份java面试必看手册

眼看着时间一天一天地过去&#xff0c;距离过年也就二个月的日子了&#xff0c;还有多少程序员是两眼摸黑不知道面试要做哪些准备的朋友&#xff1f; 还不知道进大厂需要复习哪些资料的朋友可以看过来&#xff0c;知道有些朋友会没什么准备跟无头苍蝇一样所以博主早在一个月前…

[附源码]计算机毕业设计JAVA镐京学院教务管理系统

[附源码]计算机毕业设计JAVA镐京学院教务管理系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM my…

Python文件操作

文章目录文件操作打开文件关闭文件读文件写文件使用上下文管理器文件操作 打开文件 open函数 open函数的作用是打开一个文件&#xff0c;并返回打开的文件对象。该函数的常见调用方式如下&#xff1a; f open(file, mode, encoding)参数说明&#xff1a; file&#xff1a;待…

如何实现基于场景的接口自动化测试用例?

自动化本身是为了提高工作效率&#xff0c;不论选择何种框架&#xff0c;何种开发语言&#xff0c;我们最终想实现的效果&#xff0c;就是让大家用最少的代码&#xff0c;最小的投入&#xff0c;完成自动化测试的工作。 基于这个想法&#xff0c;我们的接口自动化测试思路如下…

Android App开发实战项目之大头贴App功能实现(附源码和演示 简单易上手)

需要图片集和源码请点赞关注收藏后评论区留言~~~ 一、需求描述 大头贴App有两个特征&#xff0c;第一个是头要大&#xff0c;拿来一张照片后把人像区域裁剪出来&#xff0c;这样新图片里的人头才会比较大&#xff0c;第二个是在周围贴上装饰物&#xff0c;而且装饰物还能随时更…

【Spring】——7、@Import注解给容器中快速导入一个组件

&#x1f4eb;作者简介&#xff1a;zhz小白 公众号&#xff1a;小白的Java进阶之路 专业技能&#xff1a; 1、Java基础&#xff0c;并精通多线程的开发&#xff0c;熟悉JVM原理 2、熟悉Java基础&#xff0c;并精通多线程的开发&#xff0c;熟悉JVM原理&#xff0c;具备⼀定的线…

Ubuntu下关于cuda和cudnn 报错 现象及解决方案

详细流程&#xff1a;1、现象2、探索&#xff08;可跳过&#xff09;3、完美解决&#xff08;真实原因&#xff09;3.1 查看当前cuda版本3.2电脑有多个cuda版本&#xff0c;通过改变软链接改变指向3.3 写入系统环境&#xff1a;1、现象 啊这,重启丢失了个啥触摸的驱动&#xff…