索引 什么是MySql索引? 索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构。包含着对数据表里所有记录的引用指针。
索引的易忽略点: 索引相当于书的目录,可以加快查找的速度,但同时也提高了增、删、改的开销;
索引也提高了空间的开销,构造索引也就需要额外的硬盘空间来保存;
数据库的索引与数组的索引没有任何关系。只不过都是使用了index这样的术语。实际 上数组的index一般翻译成下标,而数据库的index一般翻译成索引
索引在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,索引,SQL,上锁
From: https://blog.51cto.com/u_13529088/8969623