MySQL索引事务

一、索引

使用一定的数据结构,来保存索引字段对应的数据,以后根据索引字段来检索,就可以提高检索效率。

一定的数据结构-->需要一定的空间来保存

建立索引:类似于建立书籍目录或者手机电话簿

使用索引:查询条件中的字段能够命中索引

创建索引,更新/删除索引字段,插入数据,都会导致索引更新的耗时操作

  • 数据库保存数据的基本单位:page
  • 目的:硬盘读取文件到内存的io操作时耗时操作,读取数据最好能最少次读取到需要的结果集

MySQL中,有多种索引类型

(1)从索引存储结构划分:B Tree索引、Hash索引、FULLTEXT全文索引、R Tree索引

(2)从应用层次划分:普通索引、唯一索引、主键索引、复合索引

(3)从索引键值类型划分:主键索引、辅助索引(二级索引)

(4)从数据存储和索引键值逻辑关系划分:聚集索引(聚簇索引)、非聚集索引(非聚簇索引)

(5)从索引列数量划分:单列索引、复合索引

创建的某个索引可以是以上多种类型

  • B树:所有节点都保存有索引列及数据;
  • B+树:叶子节点保存有索引列和数据,非叶子节点只有索引字段;
  • B树,搜索路径是从根节点搜索到叶子节点,比链表查询效率高;
  • B+树,非叶子节点可以存储更多的数据,此时树就更矮,搜索路径更短,io次数更少

1.主键索引--->唯一索引

默认B+树,聚簇索引;B+树的叶子节点上存放主键字段(索引字段)及数据

(一张表只能有一个聚簇索引)

主键索引--->叶子节点  id_number+整行数据

  • 优点:速度快
  • 缺点:主键需要是整型,且字段不要太长;更新(代价大)效率低

2.非聚簇索引

非主键索引都是,可以是有很多种类型的索引,如B+树、Hash索引等;

如:使用B+树,存储结构:叶子节点存放索引字段值+主键的值

age字段建立B+树索引--->叶子节点  age的值+id_number的值

  • 优点:更新代价相比于聚簇索引小(叶子节点是索引值和主键值,没有真实数据)
  • 缺点:(1)也依赖有序数据(2)回表操作导致效率更低

搜索数据的方式:

(1)先通过索引字段找到叶子节点上的主键值

(2)再通过主键值,赵正条数据(回表操作)(存在回表,说明效率比主键索引慢)

3.覆盖索引:

如果一个索引包含(或者说是覆盖)所有需要查询的字段的值,我们就称之为“覆盖索引”

语法:select 覆盖索引字段 from 表 where 覆盖索引字段...

  • 特殊的有些操作不会走索引:is null、is not null
  • select name from table where name='guang19';
  • 原因:检索的时候,是根据name索引字段来检索(name是在叶子节点,排序的),查询字段又没有其他字段,所以就不需要回表

4.复合索引:

使用多列来创建索引(涉及最左匹配原则:索引创建的字段顺序从左到右匹配)

ALTER TABLE table ADD INDEX index_name(num,name,age)

  • select...from 表 where num=.. and name=... and age=...--->覆盖索引(效率高)、
  • select...from 表 where name=... and num=...--->符合索引最左匹配原则
  • select * from 表 where name=... and age=...--->不符合索引最左匹配原则

查询的条件字段顺序无所谓,关键是索引创建的字段顺序

基于B+树的索引:

(1)主键索引(聚簇索引)

(2)非聚簇索引

优化原则:

(1)索引字段尽量不要有null值

查询的时候条件是-->字段 is [not] null,>,< (<=,>=)会走全表扫描,不会走索引

like的操作:匹配a开头(a%)--->可以走索引;匹配包含a或以a结尾--->不可以走索引;

(2)频繁查询的字段建立索引:需要考虑最左匹配原则顺序是左边

(3)频繁更新的字段,慎用索引(索引更新代价大)

5.hash索引

hashmap存储数据的特性:键值对、无序、键唯一(不重复)

底层数据结构:数组+链表+红黑树

原理:存取元素,复杂的都是put流程(往火车放东西)

(1)算数组位置,往上边放(根据key的hashcode值,基于内部hash函数计算出数组索引)-->找车厢

(2)如果该位置没有元素:放这个位置上(车厢是空的)

如果这个位置有元素:---> 往链表上放:是否存在节点equals(key)  --->存在,替换(车厢位置有人,他走放我自己的);不存在,考虑头插?尾插?-》可能转红黑树

(3)如果放进去了东西,可能需要扩容

  • 缺点:不支持顺序和范围查询

二、事务

1.事务的特性:

(1)原子性:事务是最小的执行单位,不允许分割。即多条sql要么都执行要么都不执行;

(2)一致性:执行事务前后,数据保持一致性。比如:转账业务中,无论事务是否成功,转账者和收款人的总额应该不变;

(3)隔离性:并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库时独立的;(不同隔离级别下,可能不一定满足某种场景的隔离性)

(4)持久性:一个事务被提交之后,它对数据库中数据的改变时持久的,即使数据库发生故障也不应该对其有任何影响;(事务提交后,数据会持久化到硬盘中)

start transaction;

-- 阿里巴巴账户减少2000

update accout set money =money-2000 where name='阿里巴巴';

-- 四十大盗账户增加2000

update accout set money =money+2000 where name='四十大盗';

开启事务后sql相关操作,都是在内存中执行;

rollback-->回滚:内存中执行的回滚不执行;

commit-->提交:内存中修改的操作执行(写入硬盘);

事务中不同隔离级别,一个事务修改的数据,其他事务可不可见要根据隔离级别。

2.事务会出现的问题

(1)丢失更新

事务1修改数据的操作,在事务2修改以后,就覆盖掉了(相当于丢失)。

(2)脏读

第一个事务修改数据后还没有提交,第二个事务就读取,此时第一个事务回滚后,第二个事务读取的就是脏数据。

(3)不可重复读

一个事务两次读取数据,中间有另一个事务修改,第一个事务两次读取的数据就不同(不一致)

(4)幻读

一个事务两次读取,中间有另一个事务执行了插入操作,造成第一个事务看到不同的结果。

解决以上问题就使用到了隔离级别

3.隔离级别

从低到高的级别(级别越高越安全但是性能越差):

(1)未提交读(read uncommitted)--->(一般都不会使用)

事务中的修改,即使没有提交,对其他事务也是可见的。

(2)提交读(read committed)--->(用的比较广泛的)

一个事务只能读取已经提交的事务所作的修改,即一个事务所作的修改在提交之前对其他事务不可见。

(3)可重复读(repeatable read)--->(MySQL默认的隔离级别)

保证在同一个事务中多次读取用一个数据的结果是一样的。

(4)可串行化(serializable)--->(公司几乎也不适用,因为性能太差)

强制事务串行执行,这样多个事务互不干扰,不会出现并发一致性问题。

串行执行--->一个事务中多行sql全部执行完(提交或者回滚),另一个事务才能执行。

脏读不可重复读幻读
未提交读×××
提交读××
可重复读×
可串行化

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

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

相关文章

HiSilicon352 android9.0 emmc添加新分区

添加新分区 从emmc中单独划分出一个分区&#xff0c;用来存储相关数据&#xff08;可用于存储照片&#xff0c;视频&#xff0c;音乐和文档等&#xff09;或者系统日志log&#xff0c;从而不影响到其他分区。 实现方法&#xff1a; device/hisilicon/Hi3751V350/etc/Hi3751V3…

Spring Boot RESTful API

学习到接口部分了&#xff0c;记录一下 关于restful api感觉这篇文章讲的十分详细且通俗易懂一文搞懂什么是RESTful API - 知乎 (zhihu.com) Spring Boot 提供的 spring-boot-starter-web 组件完全支持开发 RESTful API &#xff0c;提供了 GetMapping&#xff1a;处理get请求…

Java中如何在两个线程间共享数据

Java中如何在两个线程间共享数据 在Java中&#xff0c;在两个线程之间共享数据是常见的需求&#xff0c;但需要小心处理以确保线程安全性。有多种方式可以在两个线程之间共享数据&#xff0c;下面将详细介绍这些方式&#xff0c;以及它们的优缺点。 方式1&#xff1a;共享可变…

VBA入门2——程序结构

VBA基础入门2 VBA 程序结构VBA 程序结构入门&#xff08;认识 VBA 程序骨架&#xff09;循环结构判断结构 VBA 变量的声明和赋值&#xff08;使程序动起来&#xff09;不同变量类型声明语句如何声明多个变量声明变量是必须的嘛&#xff1f;变量赋值 VBA 程序顺序结构&#xff0…

【原创】ubuntu18修改IP地址

打开网络配置文件 sudo vi /etc/network/interfaces结果发现如下内容&#xff1a; # ifupdown has been replaced by netplan(5) on this system. See # /etc/netplan for current configuration. # To re-enable ifupdown on this system, you can run: # sudo apt inst…

3.3 数据定义

思维导图&#xff1a; 前言&#xff1a; **核心概念**&#xff1a; - 关系数据库支持**三级模式结构**&#xff1a;模式、外模式、内模式。 - 这些模式中包括了如&#xff1a;模式、表、视图和索引等基本对象。 - SQL的数据定义功能主要包括了模式定义、表定义、视图和索引的定…

bootz启动 Linux内核过程中涉及的 do_bootm_states 函数

一. bootz启动Linux uboot 启动Linux内核使用bootz命令。当然还有其它的启动命令&#xff0c;例如&#xff0c;bootm命令等等。 本文只分析 bootz命令启动 Linux内核的过程中涉及的几个重要函数。具体分析 do_bootm_states 函数执行过程。 本文继上一篇文章&#xff0c;地址…

Axure常用技巧及问题

以下内容将持续更新 目录 一、技巧1、版本选择2、快捷键3、定制工具栏 二、问题1、无法在浏览器预览2、发布到本地的HTML无法查看 一、技巧 1、版本选择 2、快捷键 3、定制工具栏 上方菜单栏-右键-自定义工具栏 二、问题 1、无法在浏览器预览 需要更改Axure配置 点击发布-…

C#之常见图形文件格式及其特点

部分内容来源于Microsoft相关文档&#xff01; 日常生活中和软件开发中&#xff0c;经常会用到图形文件格式&#xff1a; BMP BMP 是 Windows 用来存储与设备无关的图像和与应用程序无关的图像的标准格式。 给定 BMP 文件的每像素位数&#xff08;1、4、8、15、24、32 或 64…

嵌入式Linux裸机开发(六)EPIT 定时器

系列文章目录 文章目录 系列文章目录前言介绍配置过程 前言 前面学的快崩溃了&#xff0c;这也太底层了&#xff0c;感觉学好至少得坚持一整年&#xff0c;我决定这节先把EPIT学了&#xff0c;下面把常见三种通信大概学一下&#xff0c;直接跳过其他的先学移植了&#xff0c;有…

网页游戏的开发框架

网页游戏开发通常使用不同的开发框架和技术栈&#xff0c;以创建各种类型的游戏&#xff0c;从简单的HTML5游戏到复杂的多人在线游戏&#xff08;MMO&#xff09;等。以下是一些常见的网页游戏开发框架和它们的特点&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&a…

Debezium系列之:debezium版本升级到2.4.0及以上版本重大注意事项

Debezium系列之:debezium版本升级到2.4.0及以上版本重大注意事项 一、背景二、建表语句三、插入数据四、Debezium2.3及以下版本处理策略五、Debezium2.4及以上版本处理策略六、变化总结一、背景 使用 bigint.unsigned.handling.mode将连接器配置为precise时,在Debezium2.4版本…

OpenCV7-copyTo截取ROI

OpenCV7-copyTo截取ROI copyTo截取感兴趣区域 copyTo截取感兴趣区域 有时候&#xff0c;我们只对一幅图像中的部分区域感兴趣&#xff0c;而原图像又十分大&#xff0c;如果带着非感兴趣区域一次处理&#xff0c;就会对程序的内存造成负担&#xff0c;因此我们希望从原始图像中…

python安装geopy出现错误

python&#xff1a; 安装geopy出现错误 错误信息&#xff1a; 解决办法&#xff1a;再试一次 居然成功了&#xff0c;就是说&#xff0c;也不知道为什么

生产级Stable Diffusion AI服务部署指南【BentoML】

在本文中&#xff0c;我们将完成 BentoML 和 Diffusers 库之间的集成过程。 通过使用 Stable Diffusion 2.0 作为案例研究&#xff0c;你可以了解如何构建和部署生产就绪的 Stable Diffusion 服务。 推荐&#xff1a;用 NSDT编辑器 快速搭建可编程3D场景 Stable Diffusion 2.0 …

uniapp微信小程序自定义封装分段器。

uniapp微信小程序自定义封装分段器。 话不多说先上效果 这里我用的是cil框架 vue3 下面贴代码 组价代码&#xff1a; <template><view class"page"><viewv-for"(item, index) in navList":key"index"click"changeNav(ind…

docker之Harbor私有仓库

目录 一、什么是Harbor 二、Harbor的特性 三、Harbor的构成 1、六个组件 2、七个容器 四、私有镜像仓库的上传与下载 五、部署docker-compose服务 把项目中的镜像数据进行打包持久数据&#xff0c;如镜像&#xff0c;数据库等在宿主机的/data/目录下&#xff0c; 一、什么…

学习笔记 | 音视频 | 推流项目框架及细节

推流项目: 跑起来项目,再调,创造问题,注意项目跑起来包括哪些步骤 前期准备:环境的配置 依赖库要交叉编译,编译还需注意依赖的库对应的头文件(注意是绝对路径还是相对路径) Rv1126_lib、arm_libx264、arm_libx265、arm_libsrt、arm32_ffmpeg_srt、arm_openssl Ubuntu搭…

idea将jar包deploy到本地仓库

1、pom.xml文件引入配置&#xff0c;如下参考&#xff1a; <distributionManagement><snapshotRepository><id>maven-snapshots</id><url>http://nexus1.coralglobal.cn/repository/maven-snapshots/</url></snapshotRepository><…

Rust中FnOnce如何传递给一个约束Fn的回调

Rust中FnOnce如何传递给一个约束Fn的回调 下面的代码&#xff0c;set_cb(func);会报错&#xff0c;如何包装能够做到这样的效果&#xff1a; fn set_cb<F: Fn() static>(handler: F) {handler(); }fn main() {let join_handle std::thread::spawn(|| {});let func |…