写点什么

MySQL 数据库——事务和索引

  • 2022 年 5 月 12 日
  • 本文字数:2156 字

    阅读完需:约 7 分钟



ACID 原则



1.原子性(AtomIclty)︰事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;



2.一致性(Conslstency):执行事务前后,数据保持一致,多个事务对同一个数据读取的结


果是相同的;



3.隔离性(Isolatlon)︰并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发


事务之间数据库是独立的;



4.持久性(Durabllty) :一个事务被提交之后。它对数据库中数据的改变是持久的,即使数


据库发生故障也不应该对其有任何影响。 --------事务提交



并发事务带来哪些问题?(隔离所导致的一些问题)




在典型的应用程序中,多个事务并发运行,经常会操作相同的数据来完成各自的任务(多个用户对同一数据进行操作)。并发虽然是必须的,但可能会导致以下的问题。


**脏读(DIrty read) :**当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提交到数据库中,这时另外一个事务也访问了这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是"脏数据",依据"脏数据"所做的操作可能是不正确的。



**丢失修改(Lost to modlify):**指在一个事务读取一个数据时,另外一个事务也访问了该数据,那么在第一个事务中修改了这个数据后,第二个事务也修改了这个数据。这样第一个事务内的修改结果就被丢失,因此称为丢失修改。例如:事务 1 读取某表中的数据 A=20,事务 2 也读取 A=20,事务 1 修改 A=A-1,事务 2 也修改 A=A-1,最终结果 A=19,事务 1 的修改被丢失


**不可重复读(Unrepeatableread):**指在一个事务内多次读同一数据。在这个事务还没有结束时,另一个事务也访问该数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样。这就发生了在一个事务内两次读到的数据是不一样的情况,因此称为不可重复读。



**幻读(Phantom read):**幻读与不可重复读类似。它发生在一个事务(T1)读取了几行数据,接着另一个并发事务(T2)插入了一些数据时。在随后的查询中,第一个事务(T 《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 1)就会发现多了一些原本不存在的记录,就好像发生了幻觉一样,所以称为幻读。



不可重复读和幻读区别;


不可重复读的重点是修改比如多次读取一条记录发现其中某些列的值被修改,幻读的重点在于新增或者删除比如多次读取一条记录发现记录增多或减少了。


事务隔离级别有哪些?




**READ-UNCOMMITTED(读取未提交):**最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。


**READ-COMMITTED(读取已提交)︰**允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。


**REPEATABLE-READ(可重复读):**对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。


**SERIALIZABLE(可串行化):**最高的隔离级别,完全服从 ACID 的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。



MySQL 的默认隔离级别:




MySQL InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLE-READ(可重读)。我们可以通过 SELECT @@tx_isolation;命令来查看



二、索引:


=====


MySQL 官方对索引的定义为:索引 (Index)是帮助 MySQL 高效获取数据的数据结构。提取句子主干,就可以得到索引的本质:索引是数据结构


MySQL 索引使用的数据结构主要有 BTree 索引和哈希索引。对于哈希索引来说,底层的数据结构就是哈希表,因此在绝大多数需求为单条记录查询的时候,可以选择哈希索引,查询性能最快;其余大部分场景,建议选择 BTree 索引。


MySQL 的 BTree 索引使用的是 B 树中的 B+Tree,但对于主要的两种存储引擎的实现方式是不同的。


MyISAM: B+Tree 叶节点的 data 域存放的是数据记录的地址。在索引检索的时候,首先按照 B+Tree 搜索算法搜索索引,如果指定的 Key 存在,则取出其 data 域的值,然后以 data 域的值为地址读取相应的数据记录。这被称为“非聚簇索引”。


**InnoDB:**其数据文件本身就是索引文件。相比 MyISAM,索引文件和数据文件是分离的,其表数据文件本身就是按 B+Tree 组织的一个索引结构,树的叶节点 data 域保存了完整的数据记录。这个索引的 key 是数据表的主键,因此 InnoDB 表数据文件本身就是主索引。这被称为“聚簇索引(或聚集索引)”。而其余的索引都作为辅助索引,辅助索引的 data 域存储相应记录主键的值而不是地址,这也是和 MyISAM 不同的地方。在根据主索引搜索时,直接找到 key 所在的节点即可取出数据;在根据辅助索引查找时,则需要先取出主键的值,再走一遍主索引。因此,在设计表的时候,不建议使用过长的字段作为主键,也不建议使用非单调的字段作为主键,这样会造成主索引频繁分裂。


索引的作用:




  • 提高查询速度

  • 确保数据的唯一性

  • 可以加速表和表之间的连接 , 实现表与表之间的参照完整性

  • 使用分组和排序子句进行数据检索时 , 可以显著减少分组和排序的时间

  • 全文检索字段进行搜索优化.


索引的分类:




  • 主键索引 (Primary Key)


唯一的标识,主键不可重复,只能有一个列作为主键


  • 唯一索引 (Unique)


避免重复的列出现,唯一索引可以重复,多个列都可以标识位唯一索引


  • 常规索引 (Index)


默认的, index 或 key 关键字来设置


  • 全文索引 (FullText)

用户头像

还未添加个人签名 2022.04.13 加入

还未添加个人简介

评论

发布
暂无评论
MySQL数据库——事务和索引_Java_爱好编程进阶_InfoQ写作社区