索引是什么
索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引,并指定索引的类型,各类索引有各自的数据结构实现。索引就相当于一本书的目录,通过索引 可快速定位、检索数据。使用索引大大提高了查找效率,但同时索引也占用了更多的空间,拖慢了增删改的速度。
索引的使用场景
1、数据量较大,且经常对这些列进行条件查询。
2、该数据库表的插入操作,及对这些列的修改操作频率较低。
3、索引会占用额外的磁盘空间。
满足以上条件时,考虑对表中的这些字段创建索引,以提高查询效率。
反之,如果非条件查询列,或经常做插入、修改操作,或磁盘空间不足时,不考虑创建索引。
索引的常见操作
1、创建索引 对于非主键、非唯一约束、非外键的字段,可以创建普通索引。
create index 索引名 on 表名(字段名);
2、查看索引
show index from 表名;
3、删除索引
drop index 索引名 on 表名;
索引背后的数据结构
索引背后的数据结构是B+树。
B+树优势:
1、使用B+树进行查找的时候整体的磁盘IO次数是比较少的。
2、所有的查询最终都会落到叶子节点上,每次查询的磁盘IO次数都是差不多的,查询速度比较稳定。
3、叶子结点用链表连接之后,非常适合进行范围查找。
4、所有的数据存储(载荷)都是放到叶子节点上的,非叶子节点中只保存key值即可,因此非叶子节点整体占用的空间较小,甚至可以缓存到内存中(一旦能够全部放内存里,这时候磁盘IO几乎没了)。
事务是什么
事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。 在不同的环境中,都可以有事务。对应在数据库中,就是数据库事务。就是说两个操作要么都执行,要么一个都不执行。 就比如说现在有A、B两个账户,两个账户上都有1000元,现在A要给B转500元,那么A账户上就要少500元,B账户上要多500,两个操作都要执行。不能存在一个执行一个不执行,要么都不执行。 在sql中,如果第一个sql执行之后,第二个sql执行时出现意外,导致不能执行,这时候数据库就会还原操作,让第一个sql还原到执行之前(回滚)。那么数据库是怎么还原的呢?是因为数据库会将执行过的每个操作都记录下来。
⭐ 事务的相关操作
1、开启事务
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:串行化,并发程度最低(串行执行),隔离程度最高,解决了脏读,不可重复度,幻读问题,但是执行速度最慢。
小结
这里主要掌握索引是什么,它的适用场景,付出了什么代价以及索引背后的数据结构,事务的四个基本特性。
到此这篇关于MySql索引和事务定义到使用全面涵盖的文章就介绍到这了,更多相关MySql索引和事务内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!