Mysql索引

1.索引是为了加快查询速度,mysql底层使用的是B+树索引。
2.索引是以索引文件的形式存储在磁盘上。
3.索引的关键在于要减少IO的次数。

B+树索引

1.B树:是指多叉排序树。M阶指的是每个节点最多有M个分支,每个节点可以存储M-1个数据。每个节点的M-1个数据都是有序的,当每个节点的数据已经存储满时,这个时候会进行分裂,会把一个节点分成两个节点。
2.B+树在B树上做了改进只有在叶子节点才存储真实的数据,非叶子节点只会存储索引值,叶子节点之间采用双向链表的方式来进行连接。
3.B+树的优点:当获取范围数据时,不需要遍历树的一部份,只要找到一个节点,就能根据双向链表找到其他的节点。每个非页节点都能存储更多的索引值(因为不存储数据)。
4.内存和磁盘的交换是以页为单位的,并且磁盘的顺序读取比随机读取速度快的多,所以每个B+数的节点的大小都是一个页的大小。

事务

1.事务是具有ACID特性的一个或者是多个数据库操作的集合。
2.单个数据库操作会默认开启事务。

事务的基本特性

1.事务的四大特性是ACID,原子性、一致性、隔离性、持久性。
2.原子性(Atomicity):事务只有执行全部执行成功和全部执行失败,不能部分成功。
3.一致性(Consistency):执行事务前后,必须是所有的数据都保持一致状态。
4.隔离性(Isolation):并发事务执行之间无影响,在一个事务内部的操作对其他事务是不产生影响,这需要事务隔离级别来指定隔离性。
5.持久性(Durability):一旦事务完成,数据库的改变必须是持久化的。

事务的隔离级别

1.数据相关的名词介绍:
	(1)脏读:一个事务读到了一个另一个事务未提交的数据。
	(2)不可重复读:在一个事务里,先后多次读取到的同一行数据不一致。
	(3)幻读:在一个事务里,先后读到的一组数据不一致(另一个事务可能删除或者是新添加了数据)。
2.事务的隔离级别由高到低:
	1.读未提交(Read uncommitted):一个事务会读到其他事务未提交的数据,会产生:脏读、不可重复读、幻读。
	2.读已提交 (Read committed):一个事务会读到其他事务已经提交的数据,会产生:不可重复读、幻读。
	3.可重复读 (Repeatable read):一个事务会读到其他事务已经提交的数据:会产生:幻读.
	4.串行化(Serializable):所有的事务都是串行执行。

sql语句分类

DDL  数据定义语言:创建表 ,库,列,create、drop、alter
DML 数据操作语言:用来操作数据库中的记录,insert、delete、update
DQL 数据查询语言 :用来查询数据,select
DCL 数据控制语言:定义访问权限和安全级别

mysql日志和锁

1.;逻辑日志:可以认为是记录了sql语句。物理日志:可以认为是记录了数据页的变化。
2.binlog 二进制日志,是一种逻辑日志,所有的的存储引擎都会有,是由server层实现的。
3.redo  log 和undo log 是innodb独有的,是事务日志,是一种物理日志。redo log是在commit时把日志内容先写入缓存,再写入磁盘,文件大小时固定的,会循环写。undo log会记录未提交事务的逻辑,用来进行回滚,mvcc依赖于undo log。
4.MVCC多版本并发控制
(1)原理介绍:每一个表都会会有隐藏子段,包括事务id,和回滚指针(指向上一个版本的记录),没一行数据都会有一个版本链,当有事务修改某一行的数据时,会在这一行的版本链加入一条记录,事务id是当前事务的id。
(2)读已提交和可重复读依赖于mvcc:读已提交每次select之前都会产生一个readview,可重复读只在第一次select的时候产生一个readview,之后都会使用第一次产生的readview。
5.快照读:使用select形成的快照。当前读(实时读):增删改语句加上显示使用读写锁的select。只使用select不会使用锁。
6.MVCC只是解决了脏读和不可重复读以及快照读的幻读问题(就是多次使用select,不会查出另一个事务新增的数据)。
7.MVCC没有解决的是在快照产生之后,又执行insert和update语句,导致其它事务的修改和本事务的修改产生冲突,像是出现了幻觉一样。
8.锁从锁粒度来看分为:行锁,表锁。从操作来看分为读锁、写锁。行锁又根据锁范围分为记录锁、间隙锁、临键锁。innodb默认的是临键锁。
9.DML语句默认加锁,可重复读才有间隙锁和临键锁,加锁彻底解决了幻读问题。
10.当根据唯一索引和主键索引查询时,会锁住查出来的行记录和它们的间隙,当使用非唯一索引或者不使用索引时,会锁住所有的行和间隙。这种规则是为解决幻读问题。