MySQL的索引和事务

目录

1、索引

[1.1 查看索引](#1.1 查看索引)

[1.2 创建索引](#1.2 创建索引)

[1.3 删除索引](#1.3 删除索引)

[1.4 索引的实现](#1.4 索引的实现)

2、事务


1、索引

索引等同于目录,属于针对查询操作的一个优化手段,可以通过索引来加快查询的速度,避免针对表进行遍历。

主键、unique和外键都是会自动生成索引的。

索引能提高查询的速度,但也是有代价的。

1、占用更多的空间,生成索引是需要一系列的数据结构,以及一系列的额外的数据来存储到硬盘空间。

2、可能会降低插入、修改、删除的速度。

1.1 查看索引

使用 show index from 表名; 来查看索引

例如:


1.2 创建索引

使用 create index 索引名 on 表名(列名); 来创建索引

例如:

注意:

创建索引时,如果表中的数据很多,创建索引容易使服务器卡住,就需要另一台机器,在MySQL中部署相同的表,创建所需要的索引,然后导入数据替换。


1.3 删除索引

使用 **drop index 索引名 on 表名;**来删除索引

自己创建的索引可以删除,如果是自动创建的索引,不能删除。

例如:


1.4 索引的实现

索引也是通过一定的数据结构实现的,MySQL的索引是一个改进的树形结构 B+树(N叉搜索树)。

B树

B树是通过区间来进行分支的,每个节点的度都是不确定的,一个节点保存N个key,就可以划分出N+1个区间,每个区间都可以衍生一系列的子树。

一个节点中,虽然可以保存N个key,但不是无限制的,达到一定的规模,就会触发节点的分裂,当删除元素达到一定的数目,也会触发节点的合并。

B树(N叉搜索树)

特点:

1、每个节点上有M个key,划分出M+1个区间。

2、进行查询的时候,根据根节点出发,判定当前要查的数据在节点的哪个区间内,再决定下一步往哪走。

3、进行添加和删除元素时,可以涉及到节点的拆分和合并。


B+树

B+树的特点:

1、B+树也是一个N叉搜索树,一个节点上存在N个key,就划分成N个区间。

2、每个节点上N个key中,最后一个就相当于当前子树的最大值。

3、父节点上的每个key都会以最大值的身份在子节点的对应区间中存在,叶子节点这一层,包含整个树的数据全集。

4、B+树会使用链表这样的结构,把叶子节点串起来,此时就可以非常方便的完成数据集合的遍历,并且方便的从数据中按照范围取出一个"子集"。
优点:

1、N叉搜索树,树的高度是有限的。

2、非常擅长范围查询

3、所有的查询都是落在叶子节点上,查询之间的开销是稳定的。

4、由于叶子节点是全集,会把数据只存储在叶子节点上,非叶子节点只存储一个用来排序的key,所以非叶子节点用不了多少空间,就可以缓存在内存中,提升访问的速度。


2、事务

事务可以把多个SQL语句打包成一个整体,可以保证这些SQL语句要么全部执行,要么一个都不执行,具有原子性的特点。

事务的执行过程:

开始事务:start transaction;

执行各种SQL语句

主动触发回滚:rollback;

事务结束:commit;
事务的原理:

回滚**:**以日志的方式,记录事务中的关键操作,这样的记录是回滚的依据。然后以打印的方式,将内容放在文件中,即使主机掉电,也不会影响,一旦启动主机,MySQL也会重新启动,发生回滚操作。
事务的特点:

1、原子性:回滚的方式,保证操作都能执行正确。

2、一致性:事务执行前后,数据不能产生特别大的差异。

3、持久性:事务做出的修改,都是在硬盘上持久保存的,重启服务器,修改仍然有效。

4、隔离性:数据并发执行多个事务时,并发程度越高,整体的效率就越高。


提高并发执行的程度,对提高效率,但也会产生一些问题。

1、脏读问题

一个事务A正在写数据的过程中,另一个事务B读取了同一个数据,接下来事务A修改了数据,导致事务B读到的数据是一个无效数据。

解决方法:

针对写加锁,等写的操作完全执行结束,并且不再修改之后再读,并发性降低了,隔离性提高了,效率降低了,准确性提高了。
2、不可重复读

并发执行事务的过程中,如果事务A多次读取同一个数据,出现不同的情况,就是不可重复读,事务A再读的过程中,事务B修改了数据并提交了数据。

解决方法:

针对读操作进行加锁,读的时候不能再修改数据。
3、幻读

一个事务A执行的过程中,两次读取操作,数据内容没有改变,但是结果集变了,就称为"幻读"。

解决方法:

保持决定的串行执行事务,完全没有并发,效率最低,隔离最高,内容最准确。


相关推荐
UFIT2 小时前
数据库操作
数据库·sql·oracle
消失在人海中5 小时前
把Excel数据文件导入到Oracle数据库
数据库·oracle·excel
Kookoos6 小时前
ABP vNext + EF Core 实战性能调优指南
数据库·后端·c#·.net·.netcore
LLLLLindream6 小时前
Redis-商品缓存
数据库·redis·缓存
柃歌7 小时前
【LeetCode Solutions】LeetCode 176 ~ 180 题解
数据结构·数据库·sql·算法·leetcode
一眼青苔7 小时前
如何在MySQL中实现类似Redis的PING命令的功能来检测连接状态?
数据库·redis·mysql
奔驰的小野码7 小时前
SpringAI实现AI应用-使用redis持久化聊天记忆
java·数据库·人工智能·redis·spring
hweiyu008 小时前
MySQL性能分析工具:SHOW PROCESSLIST
数据库·mysql