目录
索引
什么是MySql索引?
索引的易忽略点
基本操作:
查看索引
创建索引
删除索引
索引在MySql中的数据结构
事务
使用方法
事务的核心特性
隔离性
隔离的常见问题
***MySql四个隔离级别
📌————本章重点————📌
基本操作
索引在MySql中的数据结构
事务
MySql四个隔离级别
✨————————————✨
索引
什么是MySql索引?
索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构。包含着对数据表里所有记录的引用指针。
索引的易忽略点:
- 索引相当于书的目录,可以加快查找的速度,但同时也提高了增、删、改的开销;
- 索引也提高了空间的开销,构造索引也就需要额外的硬盘空间来保存;
- 数据库的索引与数组的索引没有任何关系。只不过都是使用了index这样的术语。实际 上数组的index一般翻译成下标,而数据库的index一般翻译成索引
基本操作:
查看索引:
show index from + 表名;
创建索引:
create index + 索引名 + on + 表名(列名);
值得注意的是:如果表里有主键、unique、foreign key这些约束,就会自动为这一列创建索引;
注意:
- 最好是在创建表之初就把索引创建好。否则,如果针对一个已经有很多记录的表来创建索引是危险操作,因为频繁创建于访问会增加 IO 负担;
- 索引创建好之后,不需要手动使用,直接查询的时候就会自动来走索引;
- SQL是通过 数据库的 “执行引擎” 来进行执行的,执行引擎会自动评估哪种方案是是最快的,所以是否走索引以及是如何走的,都是不便预期的,但可以使用explain关键字,来显示出查询的过程以及具体使用索引的情况;
删除索引:
drop index + 索引名 + on + 表名;
删除索引也建议在创建表之初就规划好,也是危险操作。
索引在MySql中的数据结构:
其实,B树已经可以比二叉树更适合于做数据库的索引了,但还是不够,又引入了B+树,是对B树进行了进一步的改进;
如图所示:
- 作为一个 N 叉搜索树,高度降低下来,比较的时候,硬盘 IO 次数就少了;
- 叶子结点之间通过链表链接,更适合范围查询;
- 所有的查询都要落在叶子结点上,无论查询哪个元素,中间的比较次数都差不多,查询操作比较均衡;
- 如果有的表不只是有主键索引,还有别的非主键列也有索引,这个情况就会构造另一棵B+树,此时需要先查一遍索引列的 B+ 树,再查一遍主键列的 B+ 树,称之为“回表”;
事务
介绍:
1. 一个事务可以是一条SQL语句,一组SQL语句或整个程序。 事务可以把多个SQL打包到一起,变成一个整体。
2.事务是恢复和并发控制的基本单位。如何理解? 事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。如果失败,就会回滚到最初的状态;简单而言即为如果一个事务进行的整个过程不出现错误而顺利执行到终止,如果中途遇到错误,就会终止进行并恢复到事务初始状态。
使用方法:
第一步:开启事务 start transaction;
第二步:执行多条语句;
第三步:回滚或提交:rollback 或 commit;
(rollback即全部失败,commit即全部成功)
事务的核心特性:
1.原子性:
上面已经介绍到,事务可以将多个SQL打包起来,因此就具有原子性;
2.一致性:
事务执行前后都得是数据合法的状态;
3.持久性:
事务对SQL数据的记录总是与硬盘同步;
4.隔离性:
同时执行多个事务时,事务之间的影响程度,下面将具体介绍;
隔离性:
当多个客户端之间同时发起事务时:
如果隔离性越高,就意味着事务之间的并发程度越低,执行效率越慢,但数据的准确性越高;
如果隔离性越低,就意味着事务之间的并发程度越高,执行效率越快,但数据的准确性越低;
隔离的常见问题:
1.“脏读问题”:读到了错误数据;
例如:当我们从数据来源处读取了一段信息,但读取过后,来源处的这些信息又被改掉了或被删除了,这样就会发生脏读问题。
解决办法:降低并发性,提高隔离性,对“写操作”加锁。这样一来写的过程中不可读,写完了才可以读,就保证了安全性。同时这样操作花费的时间更长,但提高了数据来源的准确性。
2.“不可重复读问题”:在一个事务中,第一次读取到的数据在第二次读取过程中被修改。
解决办法:对 “读操作” 上锁。读的过程中不能写。
既然有“写上锁”和“读上锁”,那上锁的过程中,另一方就不能闲着呀,所以就有这样的写法:上面这些是针对同一个代码文件而言的,但是除此之外,我们可以让闲着的部分去处理其他文件,这样操作的话又可能会导致原来读到的代码没变,但文件数量变了;
3.“幻读”问题:在同一个事务中,两次读到的结果集不同。
解决办法:串行化,彻底舍弃并发
***MySql四个隔离级别:
既然事务中会出现上述的隔离问题,因此mysql提供了四个档位供我们使用,以适应不同环境下来对效率和安全性做取舍。
1.read uncommitted :
不做任何限制,事务之前都是随意并发执行的,并发程度最高,隔离性最低;
(会产生脏读+不可重复度+幻读)
2.read committed:
对写操作加锁,并发程度降低了,隔离性提高了;
(解决了 脏读 问题,但仍然存在 不可重复读 + 幻读 问题)
3.repeatable read:
对写和读都加锁了,并发程度又降低了,隔离性又提高了;
(解决了脏读 + 不可重复读,但可能存在幻读问题)
4.serializable:
严格串行化,并发程度最低(串行执行的),隔离性最高,执行速度最慢;
(解决了 脏读 + 不可重复度 + 幻读问题)