【数据库】索引和事务

news/2024/4/20 18:47:00/文章来源:https://blog.csdn.net/m0_57248752/article/details/130359209

目录

1.索引

1.1关于索引

索引是什么?

为什么要有索引?

索引的作用?

索引的优点和缺点?

1.2索引类型及创建

索引的分类

创建索引

1.3索引的数据结构

1.4索引覆盖

2.事务

2.1关于事务

概念

事务的使用

2.2事务的特性

2.3事务的隔离级别

read uncommitted

read committed

repaeteble read

serializable


1.索引

1.1关于索引

索引是什么?

概念:在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。

为什么要有索引?

索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序。数据库使用索引以找到特定值,然后顺指针找到包含该值的行。这样可以使对应于表的SQL语句执行得更快,可快速访问数据库表中的特定信息。

当表中有大量记录时,若要对表进行查询,第一种搜索信息方式是全表搜索,是将所有记录一一取出,和查询条件进行一一对比,然后返回满足条件的记录,这样做会消耗大量数据库系统时间,并造成大量磁盘I/O操作;第二种就是在表中建立索引,然后在索引中找到符合查询条件的索引值,最后通过保存在索引中的ROWID(相当于页码)快速找到表中对应的记录。

如果没有索引,那么查找时可能需要全整的遍历整个数据集,间复杂度,最坏就是O(N)有了索引之后,就可以通过⻚码,快速定位⼀个范围,然后再这个⼩范围内去找,这时的时间复杂度就
⼤⼤降低了。

索引的作用?

在数据库系统中建立索引主要有以下作用

(1)快速取数据;

(2)保证数据记录的唯一性;

(3)实现表与表之间的参照完整性;

(4)在使用ORDER by、group by子句进行数据检索时,利用索引可以减少排序和分组的时间。

索引的优点和缺点?

优点:

1.大大加快数据的检索速度;

2.创建唯一性索引,保证数据库表中每一行数据的唯一性;

3.加速表和表之间的连接;

4.在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。

缺点:

1.索引需要占物理空间。

2.当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度。

补充:索引是一个典型的以空间换时间的操作

1.2索引类型及创建

根据数据库的功能,可以在数据库设计器中创建四种索引:单列索引、唯一索引、主键索引和聚集索引。

索引的分类

a. 按使⽤场景分:普通索引,主键索引,唯⼀索引,全⽂索引
b. 按数据组织⽅式分:聚簇索引,⾮聚索引
c. 还有⼀种数据查找过程中出现的现象叫做索引覆盖

创建索引

自动创建索引:
⾃动的创建主键约束(PRIMARY KEY)、唯⼀约束(UNIQUE)、外键约束(FOREIGN KEY) 时,会⾃动创建对应列的索引。
示例:
create table test(id int primary key,name varchar(10));
show index from test;

此表中的主键自动创建了索引。

手动创建索引:
普通索引:
语法:
CREATE INDEX <索引的名字> ON tablename (列的列表);
示例:
create table test(id int,name varchar(10));
create index index_test on test(id,name);

唯一索引:
语法:
CREATE UNIQUE INDEX <索引的名字> ON tablename (列的列表);
补充:
⼀张表⾥⾄少会有⼀个索引
a. 如果⼀张表⾥没有主键,MySql会为每⼀⾏⽣成⼀个唯⼀的字段,并⽤这个字段当前做索引
b. 如果⼀张表⾥有主键,那么主键必然是索引,主键索引也叫聚簇索引, ⽽且⼀直存在这也是我们绝⼤部分情况下的使⽤场景
c. 如果⾃⼰⼿动创建索引,那会会为这个列或是列的组合(多个列)创建单独的索引,⾮聚簇索

索引的命名规范:

普通索引名:idx_<table>_<column>_<column>
唯一索引名:uniq_<table>_<column>_<column>
其中<table>是建立索引的表名,<column>是建立索引的字段名
索引名限制在30个字符内。当索引名超过30字符时,可用缩写来减少索引名的长度,如description –> desc;information –> info;address –> addr等。

1.3索引的数据结构

索引是为了快速查询,那么用什么数据结构可以使数据查询比较快呢?在HASH,二叉搜索树,B树,B+树中,MySQL选择了B+树这种数据结构。

1.HASH

哈希表: 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。

哈希作为一个非常常用的查找数据结构,它能够在O(1) 的时间复杂度下进行数据查找。

但是哈希并不支持范围查找,大于小于,between and这种操作,哈希使不支持的。

2.二叉搜索树

二叉搜索树:定义规则为“左边节点值比根节点小,右边节点值比根节点大,并且左右子节点都是排序树”。

红黑树:红黑树是一种自平衡二叉树,主要解决二叉搜索树在极端情况下退化成链表的情况,在数据插入的时候同时调整整个树,使其节点尽量均匀分布,保证平衡性,目的在于降低树的高度,提高查询效率。

二叉搜索树无法控制高度,就无法决定磁盘的访问次数。

 3.B树

B树:B树是一种多路搜索树,每个子节点可以拥有多于2个子节点,M路的B树最多可拥有M个子节点。设计成多路,其目的是为了降低树的高度,降低查询次数,提高查询效率。

但是MySQL没有选择这种数据结构,而是在B树的基础上又做了优化。

4.B+树

B+树:B+树是对于B树进行优化的多路搜索树,主要设计是将数据全部存放于叶子节点,并将叶子节点用指针进行链表链接。

1.叶子节点是相互连接的,MySQL中使用的B+树使用的是一个双向循环链表

2.叶⼦节点包含了树中所有的真实数据,非叶子节点包含的是主键和叶子节点的引用

3.在一定数量范围内,不论查找的数据是什么,查找的时间效率基本相同

4.叶子节点的数据是有序的,所以支持范围查找

5.有效降低了树的高度,减少了磁盘的IO次数

1.4索引覆盖

索引的最左原则:在查询的时候在where中按照索引的顺序写过滤条件
索引覆盖:如果索引中包含要查询的所有列,那么直接从索引中返回结果,这个叫做索引覆盖

回表查询:非主键索引查找数据时需要先找到主键,再根据主键查找具体行数据,这种现象叫回表查询

索引失效:

1. 最左原则:类似于字典的⽬录,这就是⼀个典型的复合索引
2. 判断不等:每个都要判断
3. 类型转换:与原类型不符
4. like '%xxx':第⼀个字符都不能确定,怎么去索引中⽐较呢?
5. 索引列运算 age + 1:改了原来的值
6. is null 或 is not null : 全表扫描了

2.事务

2.1关于事务

概念

事务是把一组sql语句打包运行的机制,要么全部都执行,要么全都不执行。事务是恢复和并发控制的基本单位。

例如:

现在有一个账户:

让张三给李四转账一百块,那么需要更新两条sql

如果上述sql执行错误,那么进行一个回滚操作,即回到执行前的状态;

如果执行正确,则将结果提交到数据库中,别的用户才能查询到提交后的值。

事务的使用

1.开启事务:start transaction

2.执行sql语句

3.回滚/提交事务:rollback/commit

说明:rollback是全部失败,commit是全部成功

2.2事务的特性

事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性

原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的操作要么都做,要么都不做。

一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。

隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

持久性(durability)。持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

2.3事务的隔离级别

隔离级别是对并发访问的一种限制。

如果隔离级别越低,那么可以⽀持同时访问的客户端数就越多,性能变⾼,数据安全性低;
如果隔离级别越⾼,那么可以⽀持同时访问的客户端数就越少,性能变低,数据安全性变高

隔离级别的分类:

read uncommitted
读未提交
read committed
读已提交
repaeteble read
可重复读
serializable
串行化

隔离级别从低到高,并发访问的数据从高到低,数据安全性从低到高,性能越低。

MySQL默认的隔离级别是 可重复读。

read uncommitted

将查询的隔离级别指定为 0。可以读脏数据

读脏数据:一事务对数据进行了增删改,但未提交,有可能回滚,另一事务却读取了未提交的数据

那么要解决脏读问题,就要给⼀个写操作的事务加上⼀把锁,在写这个事务从开始时加锁,事务提交或回滚的时候释放锁,被加锁的事务不能与其他事务共存,写锁也叫排他锁

 

read committed

将查询的隔离级别指定为 1。避免脏读,但可以出现不可重复读和幻读

不可重复读:一事务对数据进行了更新或删除操作,另一事务两次查询的数据不一致

解决⽅法:给读的事务也加上⼀把锁,但是这个锁是⼀把读锁(共享锁),多个读锁可以共存,但是由于写锁是排他锁,所以读锁不能与写锁共存,也就是说,在加了读锁之后,不能进⾏写操作

 

幻像读:一事务对数据进行了新增操作,另一事务两次查询的数据不一致

注意:
不可重复读是指两次查询到的单条记录结果不同

幻读指的是两次查出来的结果集不同

repaeteble read

将查询的事务隔离级别指定为 2。避免脏读,不可重复读,允许幻像读

serializable

将查询的隔离级别指定为 3。

串行化读,事务只能一个一个执行,避免了脏读、不可重复读、幻读

 

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

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

相关文章

他们是怎么使用上gpt-4的-gpt-4在哪用

为什么有人在使用GPT4 openAI尚未正式发布GPT-4模型&#xff0c;也没有公布任何与GPT-4相关的信息。因此&#xff0c;没有人可以在使用GPT-4模型。 值得注意的是&#xff0c;虽然OpenAI尚未正式发布GPT-4&#xff0c;但由于其之前发布的GPT-3具有出色的性能和功能&#xff0c…

chmod 命令 (chmod 0660)

chmod的作用: 用于设置文件所有者和文件关联组的命令,就是控制用户的权限命令 注意事项: chown 需要超级用户 root 的权限才能执行此命令。 自己常用chmod 命令是 chmod 777 * 给所有文件权限 chmod 777 文件名 给单独文件权限 这个777 是怎么来的, 或者chmod 0660 这…

C++STL详解(10) -- 使用哈希表封装unordered_set和unordered_map

文章目录 哈希表模板参数改造针对模板参数V改造增加仿函数获取具体数据类型. 哈希表的正向迭代器正向迭代器中的内置成员:正向迭代器的成员函数 哈希表插入函数的修改(适用于unordered_map)一个类型K去做set和unordered_set他的模板参数的必备条件.unordered_set的模拟实现(完整…

PySide6/PyQT多线程的使用

前言 上一篇文章介绍了在PySide6中使用多线程去解决PySide6/PyQT的界面卡死问题&#xff0c;这次来具体介绍下多线程在使用上的一些细节。 本文尝试对以下两个问题进行解决&#xff1a; 对 PySide6/PyQT 多线程的使用不熟悉&#xff1b;在 PySide6/PyQT 的应用程序里有耗时任…

【Linux基础IO之 内存文件操作】

目录&#xff1a; 前言一、引入C语言中的文件操作系统文件操作open 位图权限close、write、readlseek C语言中的文件操作函数与系统文件操作函数的联系 三、文件描述符1.文件描述符是什么2.文件缓冲区再谈重定向 四、文件缓冲区分类语言级缓冲区为什么要有两个缓冲区 五、仿写c…

OpenGL入门教程之 变换

引言 这是一个闪耀的时刻&#xff0c;因为我们即将能生产出令人惊叹的3D效果&#xff01; 变换 向量和矩阵变换包括太多内容&#xff0c;但由于学过线性代数和GAMES101&#xff0c;因此不在此做过多阐述。仅阐述包括代码的GLM内容。 GLM的使用 &#xff08;1&#xff09;GLM…

8、接口的高级用法

1、索引类型 我们可以使用接口描述索引的类型和通过索引得到的值的类型&#xff0c;比如一个数组[‘a’, ‘b’]&#xff0c;数字索引0对应的通过索引得到的值为’a’。我们可以同时给索引和值都设置类型&#xff0c;看下面的示例&#xff1a; interface RoleDic {[id: number…

Pinia与Vuex区别、Pinia安装与使用

目录 一、Pinia和Vuex区别 二、Pinia使用state、getters、actions 1、安装使用Pinia 2、State 3、actions 4、getters 三、Pinia划分模块 1、目录结构 2、store/user.js 3、某组件使用 四、Pinia持久化存储 1、安装插件 2、store/index.js 3、store/user.js 4、…

收废品小程序开发中的常见问题及解决方法

常见问题 1. 用户界面设计 小程序的用户界面设计至关重要。设计师需要在用户界面中提供清晰的指示&#xff0c;以便用户可以轻松地找到他们需要的功能。同时&#xff0c;设计师还需要确保用户界面的整体风格与公司的品牌形象相符。 2. 功能开发 开发小程序的功能需要考虑到…

5G网络切片路由选择策略介绍

终端保存的NSSP(Network Slice Selection Policy)策略来源于网络侧。 NSSP规则是将应用程序匹配到S-NSSAI(Single network slice selection assistance information),并将应用程序绑定到现有PDU会话或发起新的PDU会话。 NSSP功能 NSSP的作用就是为应用程序选择S-NSSAI和…

堆的原理解析

看这篇文章需要对比较器有一定的了解&#xff0c;可以看我的这篇文章&#xff1a; 认识比较器_鱼跃鹰飞的博客-CSDN博客 堆的实际存储方式是数组&#xff0c;但是脑海中应该把他想象成一种树的结构 依次加入下标0-8的9个数&#xff08;添加过程中会不断的和父节点大小进行比…

QT Graphics View 绘图架构之场景、视图与图形项简介

1、场景、视图与图形项 采用QPainter 绘图时需要在绘图设备的 paintEvent()事件里编写绘图的程序&#xff0c;实现整个绘图过程。这种方法如同使用 Windows 的画图软件在绘图&#xff0c;绘制的图形是位图&#xff0c;这种方法适合于绘制复杂性不高的固定图形&#xff0c;不能…

基于ResNet-attention的负荷预测

一、attention机制 注意力模型最近几年在深度学习各个领域被广泛使用&#xff0c;无论是图像处理、语音识别还是自然语言处理的各种不同类型的任务中&#xff0c;都很容易遇到注意力模型的身影。从注意力模型的命名方式看&#xff0c;很明显其借鉴了人类的注意力机制。我们来看…

机器人教学中游戏化课程案例尝试

本文内容严格按创作模板发布&#xff1a; 2023年LPL春季赛季后赛正在火热进行中&#xff0c;你们心中的总冠军是哪支队伍呢&#xff1f;作为热爱游戏的程序猿&#xff0c;一起来聊聊你那些有意义的游戏开发经历吧&#xff01; 游戏化ROS机器人课程的优势有以下七点&#xff1a…

android studio RadioButton单选按钮

1.定义 <!--单选按钮--> <TextViewandroid:layout_marginTop"10dp"android:layout_width"match_parent"android:layout_height"wrap_content"android:text"请选择你的性别&#xff1a;"> </TextView> <RadioGrou…

首发支持NOA的单征程3行泊一体域控,这家Tier1开“卷”

NOA正成为智能驾驶下半场的竞争焦点之一。 显然&#xff0c;NOA所处的L2/L2区间&#xff0c;在技术上仍然属于驾驶辅助领域&#xff0c;但在传统L2级ADAS功能的基础上增强了部分场景的功能ODD。在部分政策允许的国家和地区&#xff0c;可以实现有条件的「解放双手」。 高工智…

最佳实践|如何写出简单高效的 Flink SQL?

摘要&#xff1a;本文整理自阿里巴巴高级技术专家、Apache Flink PMC 贺小令&#xff0c;在 Flink Forward Asia 2022 生产实践专场的分享。本篇内容主要分为三个部分&#xff1a; 1. Flink SQL Insight 2. Best Practices 3. Future Works Tips&#xff1a;点击「阅读原文」查…

【Linux】一文读懂HTTP协议:从原理到应用

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《学会Linux》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录 &#x1f449;HTTP协议…

机器人工程师与孔乙己文学

本文内容严格按创作模板发布&#xff1a; 孔乙已是鲁迅笔下人物&#xff0c;穷困流倒还穿着象征读书人的长衫&#xff0c;迁腐、麻木。最近&#xff0c;大家自我调佩是“当代孔乙己”&#xff0c;学历成为思想负担&#xff0c;找工作时高不成低不就。你可以从以下几个角度说说…

Android---启动页+闪屏页

目录 启动页 闪屏页 启动页 app 在进入首页面的过程中&#xff0c;都会线加载一张图片然后再进入闪屏页。这样&#xff0c;可以给用户很好的体验。 作用&#xff1a;避免加载白屏页面&#xff0c;进行业务的预处理&#xff08;网络检测、数据预加载...&#xff09; 界面组成…