MySQL数据库索引和事务详解

news2024/11/15 15:49:12

目录

前言:

索引

查看索引

创建索引

删除索引

索引使用

底层数据结构分析

事务

事务引出

MySQL设计事务

事务四大特性

小结:


前言:

    数据库索引和事务的存在,对于数据库的一些性能有了显著提升。我们需掌握其底层的实现原理。

索引

查看索引

    语法:show index from 表名;

show index from student;

    注意:可以清楚看见id这一列是由primary key约束的,具有索引。

创建索引

    语法:create index 索引名称 on 表名(列名);

create index idx_student_name on student(name);

注意:

    索引已经创建成功,name这列已经具有索引。一个表只能有一个主键,但是可以有多个索引。

    创建索引最好在创建表最初时就创建成功。如果一张表有大量数据,创建索引是极其危险的行为。需要读取服务器硬盘数据,会消耗大量的磁盘IO。这段时间里数据库可能无法正常使用。

删除索引

   语法:drop index 索引名称 on 表名;

drop index idx_student_name on student;

    注意:name这列索引已经删除成功。同样的删除索引也需要读取硬盘数据,也是危险行为。

索引使用

    索引创建成功后,不需要手动使用,在执行查询语句时会分析具体使用还是不使用索引。SQL是通过数据库执行引擎来执行的,它会自动评估这次查询使用还是不使用索引,并且会对SQL进行一些优化操作。选择成本低,速度快的方案。那么一次查询是否在走索引,以及怎么走,我们是不好分析的。可以通过explain关键字,具体查询索引的使用情况。

底层数据结构分析

    如果使用哈希表作为底层数据结构。由于数据库中经常进行范围查询,而哈希表只能进行是否相等的查询,那么哈希表显然就不适合。如果使用二叉搜索树来作为底层数据结构,由于数据量特别大时,树的高度就会比较高,而树的高度决定了查找的次数。服务器中的查询需要读取硬盘数据,这样会增加IO的压力,也是不合适的。

    如果使用N叉搜索树(B树)作为底层数据结构。它每个节点上有多个值,同时有多个分叉。这样树的高度就会降低,但随之带来的是不稳定的查询。

    这样的结构可以降低树的高度。一个节点上有多个数据,可以减少读取硬盘的次数(一次可读多个数据)。由于数据的实体都是在节点上存储,即可能一次就查找到目标数据,也可能多次查找到目标数据,带来的是不稳定的查询。在B树的基础上提出了B+树。

    B+树作为MySQL的InnoDB数据库引擎里典型的数据结构。不同的数据库,不同的引擎,底层的数据结构可能会不一致。

    B+树的叶子节点是用链表连接起来的。由于子节点包含父节点的数据,并且是以最大值出现的。即在叶子节点就会包含所有数据的全集合。

结构特点:

   1)可以使树的高度降低下来。

   2)一次可对读多条数据,减少对硬盘的读取次数,降低硬盘IO压力。

   3)数据的全集和是用链表连接起来,更加适合范围查询。

   4)由于叶子节点包含数据的全集和,可将实体数据存入叶子节点,非叶子节点存储索引即可。

   5)所有查询都是落入叶子节点,无论查询那个数据,中间比较次数都差不多,查询比较稳定。

注意:

    一个表可能有多个索引。非主键有索引,也会构造一个B+树。非叶子节点存储索引,叶子节点存储主键id。

    如果使用主键查询,只需要查一次B+树即可。如果使用非主键的索引查询,需要遍历一次非主键的B+树,找到对应的主键id,再去查主键的B+树。这样的操作称为回表。

事务

事务引出

    由于一些操作是一个整体。例如转账操作,需要从一个户主账户里扣钱,另一个户主账户里要增加钱。两步操作要么都进行,要么都不进行。

    MySQL中为了保证这样的想法,就将这两个操作称为一个事务。事务是不可以分割的,体现出事务的原子性。如果事务执行一半出错了,MySQL中会记录目前正在进行事务的操作,一旦发生错误就会进行恢复操作。保证和之前执行的样子一致。称为回滚操作(rollback),也是事务一致性的体现。

MySQL设计事务

    start transaction;//开启事务

       中间写多个SQL

    commit;//提交事务

    注意:中间的SQL不会立即执行,等到commit统一执行(保证原子性)。可以使用rollback主动进行回滚,恢复之前的状态。

事务四大特性

1)原子性

    一个事务是一个整体,不可以分割。

2)一致性

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

3)持久性

    数据库操作都是针对于硬盘,产生的效果就具有持久性。

4)隔离性

    首先介绍一个例子。我在写数据的时候,如果旁边有人看,他可能读一个错误的数据,因为我可能会改,称为脏读问题。如果我写完他在看,会解决脏读问题,但我可能会更新我写的东西,造成他前后读的数据不一样,称为不可重复读问题。如果我写完他再看,并且他在看的时候我不能更新,可以解决脏读和不可重复读问题,但我可以写其他的数据,造成他读数据的集合不一样,称为幻读问题。

    其实这个过程我在逐渐减小读和写的并发程度。并发越低,隔离性就越高,执行效率越低,数据准确度越高。并发越高,隔离性就越低,执行效率就越高,数据准确度越低。

MySQL提供了四个隔离级别

1)read uncommitted 

    不做任何限制,并发程度最高,隔离性最低,执行效率最高,数据最没有准确度。会造成脏读,不可重复的,幻读问题。

2)read committed

    对写操作加锁,降低并发程度,隔离性增加,执行效率降低,数据准确度增加。解决脏读问题。

3)repeatable read

    对读和写都加锁,又进一步降低并发程度,隔离性又进一步增加,执行效率又降低,数据准确度又进一步增加。解决脏读,不可重复读问题。

4)serializable

    严格串行化,并发程度最低,隔离性最高,执行效率最低,数据准确度最高。解决脏读,不可重复读,幻读问题。

小结:

    在学习过程中,要多思考底层的原理,对于我们理解会有很大帮助,也会加深印象。坚持就会有不一样的收获。

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

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

相关文章

NUMA那些事儿

NUMA——Non Uniform Memory Access,中文为非统一内存访问,在NUMA出现之前,内存的控制器是包含在北桥芯片中的,所有内存由北桥统一管理,因此可以保证访问内存的一致性。随着CPU架构的不断迭代和演进,核数越…

Elasticsearch与Kibana安装

现有环境 windows docker ubuntu Elasticsearch安装 安装包下载 ES不同平台、版本下载路径:Download Elasticsearch | Elastic 本文演示用linux # 启动ubuntu环境,开放端口9200、9300、5601 docker run -name es -p 9200:9200 -p 9300:9300 -p 5…

指夹式血氧饱和检测仪方案分析

指夹式心率血氧饱和度方案的测量原理是根据血红蛋白(Hb)和氧合血红蛋白 (HbO2)在红光和近红光区域的吸收光谱特性为依据,运用Lambert Beer定律建立数据处理经验公式,采用光电血氧检测技术结合光电容积脉搏波描记(PPG)技术&#xf…

化工制造行业数字化升级案例—基于HK-Domo商业智能分析工具

案例背景导读 世伟洛克(Swagelok)是全球领先的流体系统解决方案的开发商和制造商,为包括科研、仪表、制药、油气、电力、石化、代用燃料和半导体等在内的各个行业提供产品、组装和服务。世伟洛克通过独立的销售和服务中心网站进行运营&#x…

使用 Typescript 封装 Axios

对 axios 二次封装,更加的可配置化、扩展性更加强大灵活 通过 class 类实现,class 具备更强封装性(封装、继承、多态),通过实例化类传入自定义的配置 创建 class 严格要求实例化时传入的配置,拥有更好的代码提示 /*** param {AxiosInstance…

C语言习题练习8--二进制操作符

IO型--从main函数开始写,要写输入、计算、输出 接口型--不需要写主函数,默认主函数是存在的,你只需要完成函数就行 一、二进制中1的个数 (12条消息) C语言丨关键字signed和unsigned 的使用与区别详解_Emily-C的博客-CSDN博客_signed unsi…

【笔记】samba shell 脚本 离线安装 - Ubuntu 20.04

前言 按照官网调试代码、网上各种步骤来走(还收费)都不行 结果发现是防火墙问题 公司服务器安装的ufw使用失效,导致端口号放行添加失败 换用firewall-cmd成功 现在免费放下代码,气死他们收费的 目录 ├── home│ ├── k…

linux备份mysql8.0数据库脚本

文章目录环境要求步骤1、创建一个.sh文件编写shell脚本2、添加定时任务环境要求 linux系统,安装了mysql8.0 步骤 1、创建一个.sh文件编写shell脚本 创建文件的命令: vim ***.shshell文件文件参考自文章 链接 export LANGen_US.UTF-8 #注意&#xf…

测试开发技术:Python测试框架Pytest的基础入门

Pytest简介 Pytest is a mature full-featured Python testing tool that helps you write better programs.The pytest framework makes it easy to write small tests, yet scales to support complex functional testing for applications and libraries. 通过官方网站介绍…

十五、Lua 协同程序(coroutine)的学习

Lua 协同程序(coroutine) 什么是协同(coroutine)? Lua 协同程序(coroutine)与线程比较类似:拥有独立的堆栈,独立的局部变量,独立的指令指针,同时又与其它协同程序共享全局变量和其它大部分东西。 协同是非常强大的功…

2646-61-9, 脯氨酰内肽酶(PEP)底物: Z-GPLGP-OH

编号: 160473中文名称: 脯氨酰内肽酶(PEP)底物:Z-Gly-Pro-Leu-Gly-ProCAS号: 2646-61-9单字母: Z-GPLGP-OH三字母: Cbz-Gly-Pro-Leu-Gly-Pro-COOH氨基酸个数: 5分子式: C28H39O8N5平均分子量: 573.64精确分子量: 573.28等电点(PI): -pH7.0时的…

Arduino程序设计(三) 光照采集 + 温度采集

光照采集 温度采集前言一、光敏电阻检测环境光二、DS18B20检测环境温度总结参考文献前言 本文主要介绍两种常见的传感器采集环境参数,即光照传感器和温度传感器。光照传感器采用光敏电阻GL3516(5-10K)检测环境光。温度传感器采用DS18B20检测…

2022Q3家电行业高增长细分市场分析(含热门品类数据)

2022年,在大环境的影响下,大众消费偏好更趋于理性化、追求高性价比,不少行业增速有所放缓,在此背景下,2022年Q3季度中,消费市场中仍有一些高增长概念涌现。 在家电行业中,我们发现了3个高增长品…

【重识云原生】第六章容器基础6.4.9.5节——端点切片(Endpoint Slices)

1 EndpointSlice特性 Kubernetes v1.21 [stable] 端点切片(EndpointSlices) 是一个新 API,它提供了 Endpoint API 可伸缩和可拓展的替代方案。EndpointSlice 会跟踪 Service Pod 的 IP 地址、端口、readiness 和拓扑信息。 在 Kubernetes v…

一文看懂页面置换算法

页面置换算法分为两类 1、局部页面置换算法 最优页面置换算法(OPT、optimal)先进先出算法(FIFO)最近最久未使用算法(LRU,Least Recently Used)时钟页面置换算法(Clock)最不常用算法…

【算法 | 实验18】在字符矩阵中查找给定字符串的所有匹配项

文章目录题目描述思路分析bug记录:"error: >> should be > > within a nested template argument list"代码题目描述 题目 在字符矩阵中查找给定字符串的所有匹配项 给定一个MN字符矩阵,以及一个字符串S,找到在矩阵中所…

给Git仓库添加.gitignore:清理、删除、排除被Git误添加的临时文件

文章目录一、前言二、发现提交的临时文件三、去掉临时文件的方法3.1 添加.gitignore3.2 删除临时文件缓存3.3 添加后的效果一、前言 最近维护代码过程中,发现某APP代码库里被提交了许多临时文件,而这些临时文件每次都会变化,所以导致每次修改…

为什么要写单测

一、什么是单元测试 “在计算机编程中,单元测试又称为模块测试,是针对程序模块来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在过程化编程中,一个单元就是单个程序、函数、过程等;对于面向对象编程,最…

大屏经典组件:“无限滚动” 从分析到开发

📖阅读本文,你将 理解大屏 “无限滚动组件” 的开发思路跟随作者,一步步完成一个高性能 “无限滚动组件” 的开发收获一份该实现的粗糙源码。 一、无限滚动:事件/告警 的有力帮手 1.1 为什么需要滚动列表 大屏之所以 “炫酷” …

稳压二极管稳压电路如何设计

在一些电流不大的地方,一般毫安级别,有时候我们可以利用稳压二极管去设计一个我们需要的电压。 大家可以看下稳压二极管的伏安曲线 在反向电压下,尽管电流在很大的范围内变化,而稳压二极管两端的电压却基本上稳定在击穿电压附近&a…