mysql索引和事务

 

mysql索引和事务_第1张图片


目录

索引是什么

索引的使用场景

索引的常见操作

索引背后的数据结构

事务是什么

事务的基本特性

小结


索引是什么

      索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引,并指定索引的类型,各类索引有各自的数据结构实现。索引就相当于一本书的目录,通过索引 可快速定位、检索数据。使用索引大大提高了查找效率,但同时索引也占用了更多的空间,拖慢了增删改的速度。

索引的使用场景

1、数据量较大,且经常对这些列进行条件查询。
2、该数据库表的插入操作,及对这些列的修改操作频率较低。
3、索引会占用额外的磁盘空间。
满足以上条件时,考虑对表中的这些字段创建索引,以提高查询效率。
反之,如果非条件查询列,或经常做插入、修改操作,或磁盘空间不足时,不考虑创建索引。

索引的常见操作

1、创建索引
对于非主键、非唯一约束、非外键的字段,可以创建普通索引。
create index 索引名 on 表名(字段名);

mysql索引和事务_第2张图片

2、查看索引

show index from 表名;

3、删除索引

drop index 索引名 on 表名;

索引背后的数据结构

索引背后的数据结构是B+树。

mysql索引和事务_第3张图片

 B+树优势:

1、使用B+树进行查找的时候整体的磁盘IO次数是比较少的。

2、所有的查询最终都会落到叶子节点上,每次查询的磁盘IO次数都是差不多的,查询速度比较稳定。

3、叶子结点用链表连接之后,非常适合进行范围查找。

4、所有的数据存储(载荷)都是放到叶子节点上的,非叶子节点中只保存key值即可,因此非叶子节点整体占用的空间较小,甚至可以缓存到内存中(一旦能够全部放内存里,这时候磁盘IO几乎没了)。

mysql索引和事务_第4张图片

事务是什么

      事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。
在不同的环境中,都可以有事务。对应在数据库中,就是数据库事务。就是说两个操作要么都执行,要么一个都不执行。
     就比如说现在有A、B两个账户,两个账户上都有1000元,现在A要给B转500元,那么A账户上就要少500元,B账户上要多500,两个操作都要执行。不能存在一个执行一个不执行,要么都不执行。
     在sql中,如果第一个sql执行之后,第二个sql执行时出现意外,导致不能执行,这时候数据库就会还原操作,让第一个sql还原到执行之前(回滚)。那么数据库是怎么还原的呢?是因为数据库会将执行过的每个操作都记录下来。
事务的相关操作
 
1、开启事务
start transaction;

2、回滚或提交

rollback/commit;
//rollback即是全部失败,commit即是全部成功。

mysql索引和事务_第5张图片

事务的基本特性

1、原子性

原子性是指两个操作要么全部都执行,要么一个都不执行,操作不可再细分了。

2、一致性

一致性是指数据库的数据在事务执行之前和之后都要是合理合法的。(例如上面的转账,账户不能出现负数的情况)

3、持久性

持久性是指事务一旦被提交之后,数据就被写入硬盘,持久化的存储起来了。

4、隔离性

隔离性是指事务并发执行时产生的情况。

事务并发执行是指多个事务同时执行,多个事务并发执行时,尤其时多个事务在尝试修改、读取同一份数据时,很容易出现一些问题,隔离性就是在处理这些问题。

⭐并发执行事务可能带来的问题:

1、脏读问题

      事务A正在输入某些数据,这是事务B过来读取了事务A正在输入的数据,然后B回去按照A的数据进行输入,若事务A在事务B读取数据之后对数据进行了修改,这时候事务B读到的数据就有可能是一个"脏数据"(这个数据只是一个临时的的结果,而不是最终结果),这就是脏读问题。

如何处理脏读问题?

      在写数据的时候进行加锁处理,等A完全写完修改完之后再让B看,这时候事务之间的隔离性就提高了,但同时并发性也降低了。

2、不可重复读问题

      按照以上处理,等到A全部写完B再看,但是如果A在B读的时候又修改了代码,这时候B再回过头来看,数据又不一样了,不能重复读这个数据,这怎么办?这时候干脆就将读也加上锁,在A写入数据的时候B不能读,在B读数据的时候A也不能修改。这时候事务的隔离性又提高了,并发性又降低了。

3、幻读问题

      以上两个操作,给读和写都加上了锁,虽然它的隔离性提高了,但是却降低了效率,导致读和写的时间都变得更长了起来,这时候在写或者读的过程事务可以去改其他表或者这个表的其他行(事务虽然在提交隔离性时进行了一系列的加锁,但是并没有把整个数据库给锁定了),这时候B在读数据的时候会发现数据数量变了,本来只有一个A.java,现在又多了个B.java,这就是幻读问题。总的来说就是一个事务执行过程中进行多次查询,每次查询的结果集不一样(多或者少),这也是一种特殊的不可重复读问题。

该如何解决呢?

事务串行化执行。(串行化执行就是事务一个一个执行)

通过以上我们也知道了隔离性和并发性不能同时得到,要想提高隔离性,并发性就得降低。

进行了以上修改,这时候隔离性程度最高,并发性程度最低,数据最可靠,速度也最慢。

⭐根据以上总结,MySQL中事务的隔离级别,提供了以下这几种:
1. read uncommitted:允许读取未提交的数据,并发程度最高,隔离程度最低,会引入脏读、不可重复读、幻读问题。
2. read committed:只允许读取提交之后的数据,相当于写加锁,并发程度降低了一些,隔离程度提高了一些, 解决了脏读,会引入不可重复读和幻读。
3. repeatable read:相当于给读和写都加锁,并发程度又降低了,隔离程度又提高了,解决了脏读和不可重复度,会引入幻读。
4. serializable:串行化,并发程度最低(串行执行),隔离程度最高,解决了脏读,不可重复度,幻读问题,但是执行速度最慢。

小结

这里主要掌握索引是什么,它的适用场景,付出了什么代价以及索引背后的数据结构,事务的四个基本特性。以上就是今天的内容了,有什么问题大家可以在评论区留言。

mysql索引和事务_第6张图片

你可能感兴趣的:(mysql,mysql,数据库)