目录
🥬索引是什么
🥬索引的使用场景
1、数据量较大,且经常对这些列进行条件查询。
2、该数据库表的插入操作,及对这些列的修改操作频率较低。
3、索引会占用额外的磁盘空间。
满足以上条件时,考虑对表中的这些字段创建索引,以提高查询效率。
反之,如果非条件查询列,或经常做插入、修改操作,或磁盘空间不足时,不考虑创建索引。
🥬索引的常见操作
create index 索引名 on 表名(字段名);
2、查看索引
show index from 表名;
3、删除索引
drop index 索引名 on 表名;
🥬索引背后的数据结构
索引背后的数据结构是B+树。
B+树优势:
1、使用B+树进行查找的时候整体的磁盘IO次数是比较少的。
2、所有的查询最终都会落到叶子节点上,每次查询的磁盘IO次数都是差不多的,查询速度比较稳定。
3、叶子结点用链表连接之后,非常适合进行范围查找。
4、所有的数据存储(载荷)都是放到叶子节点上的,非叶子节点中只保存key值即可,因此非叶子节点整体占用的空间较小,甚至可以缓存到内存中(一旦能够全部放内存里,这时候磁盘IO几乎没了)。
🥬事务是什么
start transaction;
2、回滚或提交
rollback/commit;
//rollback即是全部失败,commit即是全部成功。
🥬事务的基本特性
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:串行化,并发程度最低(串行执行),隔离程度最高,解决了脏读,不可重复度,幻读问题,但是执行速度最慢。
🥬小结
这里主要掌握索引是什么,它的适用场景,付出了什么代价以及索引背后的数据结构,事务的四个基本特性。以上就是今天的内容了,有什么问题大家可以在评论区留言。