MySQL数据库的事务和索引详解

 更新时间:2021年10月11日 09:48:45   作者:龍弟-idea  
这篇文章主要介绍了MySql 索引和事务,总结分析了mysql数据库中关于索引和事务的概念、原理、知识点及相关注意事项,需要的朋友可以参考下

一、事务:

事务是逻辑上的一组操作,要么都成功,要么都失败!

——————————————————————————————————

1、SQL执行        A:1000元     ——>转账200元        B:200元

2、SQL执行        A:800元       ——>                        B:400元

——————————————————————————————————

将一组SQL放在一个批次中执行

事务四大特性:

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)插入了一些数据时。在随后的查询中,第一个事务(T1)就会发现多了一些原本不存在的记录,就好像发生了幻觉一样,所以称为幻读。

不可重复读和幻读区别;

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

事务隔离级别有哪些?

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)

在特定的数据库引擎下才有,MylSAM

快速定位数据

索引准则:

  • 索引不是越多越好
  • 不要对经常变动的数据加索引
  • 小数据量的表建议不要加索引
  • 索引一般应加在查找条件的字段

索引的数据结构:

-- 我们可以在创建上述索引的时候,为其指定索引类型,分两类
hash类型的索引:查询单条快,范围查询慢
btree类型的索引:b+树,层数越多,数据量指数级增长(我们就用它,因为innodb默认支持它)
-- 不同的存储引擎支持的索引类型也不一样
InnoDB 支持事务,支持行级别锁定,支持 B-tree、Full-text 等索引,不支持 Hash 索引;
MyISAM 不支持事务,支持表级别锁定,支持 B-tree、Full-text 等索引,不支持 Hash 索引;
Memory 不支持事务,支持表级别锁定,支持 B-tree、Hash 等索引,不支持 Full-text 索引;
NDB 支持事务,支持行级别锁定,支持 Hash 索引,不支持 B-tree、Full-text 等索引;
Archive 不支持事务,支持表级别锁定,不支持 B-tree、Hash、Full-text 等索引;

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

相关文章

  • MySQL死锁解析与解决方法

    MySQL死锁解析与解决方法

    在数据库管理中,死锁是一种常见而又棘手的问题,当多个事务相互等待对方释放锁资源时,死锁就会发生,本文将介绍MySQL中死锁产生的原因、如何查询死锁,以及解决死锁的方法,需要的朋友可以参考下
    2024-01-01
  • Centos 7下使用RPM包安装MySQL 5.7.9教程

    Centos 7下使用RPM包安装MySQL 5.7.9教程

    这篇文章主要为大家详细介绍了Centos 7下使用RPM包安装MySQL 5.7.9的教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • mysql插入重复数据的处理(DUPLICATE、IGNORE、REPLACE)

    mysql插入重复数据的处理(DUPLICATE、IGNORE、REPLACE)

    这篇文章主要介绍了mysql插入重复数据的处理方式(DUPLICATE、IGNORE、REPLACE),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • 使用squirrel进行sql拼接不生效问题及解决

    使用squirrel进行sql拼接不生效问题及解决

    这篇文章主要介绍了使用squirrel进行sql拼接不生效问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • Mysql LONGBLOB 类型存储二进制数据 (修改+调试+整理)

    Mysql LONGBLOB 类型存储二进制数据 (修改+调试+整理)

    代码来自网络,我学习整理了一下,测试通过,下面的参数需要设置为你自己的
    2009-07-07
  • Windows免安装MySQL 8.0.28 版本图文教程

    Windows免安装MySQL 8.0.28 版本图文教程

    这篇文章主要为大家详细介绍了Windows免安装MySQL8.0.28版本图文教程,文中安装步骤介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • Centos 7 安装mysql5.7.24二进制 版本的方法及解决办法

    Centos 7 安装mysql5.7.24二进制 版本的方法及解决办法

    这篇文章主要介绍了Centos 7 安装mysql5.7.24二进制 版本的方法 及遇到问题解决办法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-11-11
  • MySQL中字段类型char、varchar和text的区别

    MySQL中字段类型char、varchar和text的区别

    今天小编就为大家分享一篇关于MySQL中字段类型char、varchar和text的区别,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • pymysql操作mysql数据库的方法

    pymysql操作mysql数据库的方法

    这篇文章主要介绍了pymysql简单操作mysql数据库的方法,主要讲的是一些基础的pymysql操作mysql数据库的方法,结合实例代码给大家讲解的非常详细,需要的朋友可以参考下
    2023-04-04
  • sql跨表查询的三种方案总结

    sql跨表查询的三种方案总结

    这篇文章主要介绍了sql跨表查询的三种方案总结,文章围绕主题展开详细的内容,具有一定的参考价值,需要的小伙伴可以参考一下,希望对你的学习有所帮助
    2022-08-08

最新评论