自学内容网 自学内容网

Mysql(索引与事务)

索引查询与普通查询的区别

普通查询 :执行步骤为先对表进行遍历,然后把当前的行带入条件中进行判断,符合条件执行,不符合跳出。这种情况在遇见数据较多的情况下就会出现问题,效率太低。

索引查询:是对查询操作的优化手段,通过索引可以加快查询的速度(一个索引是针对一列来进行指定的,只有针对这一列条件进行查询时,查询速度才会被优化),避免对表进行遍历。缺点 由于索引查询生成索引需要一些列的数据结构,这些数据存贮在硬盘上占用内存,其次引进索引后对数据修改删除插入还要对索引进行修改,因此对数据的插入修改删除的速度也会大大降低。

 索引的操作

查看索引

show index from 表名;

 不加约束时不会生成索引,下图案例在对索引查询的时候显示的就是空,主键,unique,外键都会生成主键。

使用主键,会自动生成索引。

外键约束的索引 :

创建索引

create index 索引名字 on 表名 (列名);

删除索引

drop index 索引名字 on 表名;

 索引的背后逻辑(面试)

数据库索引的引入是一个改进的树形结构,B+树(N叉搜索树)。一个节点上存在N个key,划分成N个区间,每个节点上N个key中最后一个相当于当前子树的最大值,父节点上的每一个key都会以最大的身份在子节点的对应区间中存在因此父节点的key可能重复出现。B+树的最大优点就是,B+树会构成和链表一样的结构通过节点进行前后链接。这样在查询某一区间的数据只用知道首尾就可以把数据区间取出。相对于普通的树形结构减少了回溯的次数,减少了硬盘i/o的读取。

什么是事务

在早些年代会出现,A给B转了钱而B却并未收到,因此引入了事务中的回滚(指的是通过检查若没有执行成功就回退回去,比如A给B转了钱而B却并未收到时,那么就会触发回滚把A转出金额再返回给A)来解决这一问题。事务是把多个SQL打包成为一个整体,要么都执行,要么做到看起来都不执行的样子。

事务的特性:

  • 原子性:保证一系列操作都能正确执行或者恢复如初
  • 一致性:事务执行之前之后,数据都不能太离谱
  • 持久性:事务做出的修改,都是在硬盘上持久保存的。服务器重启数据依然存在
  • 隔离性:解决数据库处理并非事务中出现的问题

并发处理事务中的问题

1.“脏读”:指的是A正在写数据的过程,B在读取A的数据,随后A修改了数据,导致B之前读入的数据变成了无效数据。

2.重复读:指的是并发执行事务过程中,如果事务A在内部多次读取同一个数据的时候,出现不同的情况,这种情况就是不可重复读。简单说对一个事务不能出现两次读取是不同的事务

3.幻读:指的是一个事务A执行过程中两次读取并未发生数据内容的变化,但是结果集发生了变化(结果集中临时表多了或少了)

如何解决并发处理事务中的问题

  • 解决脏读的方法就是通过对核心数据进行“写加锁”(写的时候不能读)
  • 解决重复读的方法是“读枷锁”(读的时候不能写)
  • 解决重幻读的方法是保证绝对的串行执行事务,此时完全没有并发

事务开启

start transaction;//开启事务后执行的每个sql都自成一个体系

事务结束

commit; //事务结束

主动触发回滚

rollback;//主动触发回滚,一般是要搭配一些逻辑条件进行使用


原文地址:https://blog.csdn.net/qq_63074244/article/details/142618077

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!