mysql知识归纳

常用的数据库引擎有两种:MyISAMInnoDB
MyISAM只支持表级锁;Inno支持行级锁(默认)和表级锁
MyISAM强调性能,不支持事务;InnoDB支持事务、外键。
InnoDB支持MVCC(多版本并发控制),MVCC只支持READ COMMITTED(读已提交) 和 REPEATABLE READ(可重复读) 两个隔离级别下工作

索引

InnoDB: 其数据文件本身就是索引文件。相比MyISAM,索引文件和数据文件是分离的,其表数据文件本身就是按B+Tree组织的一个索引结构,树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。这被称为“聚簇索引(或聚集索引)”
B+数的非叶子节点最多只有M个儿子,且M>2;所有非叶子节点只保存索引,不保存实际的数据,数据都保存在叶子节点中(只有最底层才存放文件)。
索引主要有主键索引、唯一索引、普通索引、组合索引(最左匹配原则)、全文索引。
聚簇索引将索引和数据连在一起、非聚簇索引把索引和数据分开存放。(效率)

mysql知识归纳_第1张图片

如果组合索引列为:A,B
select * from user where A=xx and B=xx ; //可以命中索引
select * from user where A=xx ; // 可以命中索引
select * from user where B=xx ; // 无法命中索引

B树与B+树的区别

B树的所有节点既存放 键(key) 也存放 数据(data);而B+树只有叶子节点存放 key 和 data,其他内节点只存放key。
B树的叶子节点都是独立的;B+树的叶子节点有一条引用链指向与它相邻的叶子节点。
B树的检索的过程相当于对范围内的每个节点的关键字做二分查找,可能还没有到达叶子节点,检索就结束了。而B+树的检索效率就很稳定了,任何查找都是从根节点到叶子节点的过程,叶子节点的顺序检索很明显。

事务

四大特性ACID:原子性、一致性、隔离性、持久性
并发事务带来的影响:
脏读(Dirty read): 当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提交到数据库中,这时另外一个事务也访问了这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是“脏数据”,依据“脏数据”所做的操作可能是不正确的。
丢失修改(Lost to modify): 指在一个事务读取一个数据时,另外一个事务也访问了该数据,那么在第一个事务中修改了这个数据后,第二个事务也修改了这个数据。这样第一个事务内的修改结果就被丢失,因此称为丢失修改。
不可重复读(Unrepeatableread): 指在一个事务内多次读同一数据。在这个事务还没有结束时,另一个事务也访问该数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样。这就发生了在一个事务内两次读到的数据是不一样的情况,因此称为不可重复读。
幻读(Phantom read): 幻读与不可重复读类似。它发生在一个事务(T1)读取了几行数据,接着另一个并发事务(T2)插入了一些数据时。在随后的查询中,第一个事务(T1)就会发现多了一些原本不存在的记录,就好像发生了幻觉一样,所以称为幻读。
不可重复读的重点是修改比如多次读取一条记录发现其中某些列的值被修改,幻读的重点在于新增或者删除比如多次读取一条记录发现记录增多或减少了。

事务隔离的级别:
READ-UNCOMMITTED(读取未提交): 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。
READ-COMMITTED(读取已提交): 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。
REPEATABLE-READ(可重复读): 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
SERIALIZABLE(可串行化): 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。
隔离级别 脏读 不可重复读 幻影读
READ-UNCOMMITTED √ √ √
READ-COMMITTED × √ √
REPEATABLE-READ × × √
SERIALIZABLE × × ×
相比spring的事务(默认(使用后端数据库默认的隔离级别),其它的四个和数据库一致)

利用索引覆盖策略来进行查询的优化:
简单的来说就是查找过程中只查找索引,来返回结果,这样能够有效的减少回表的次数。
利用explain来进行查看,是否有命中索引,命中的哪个一个索引以及是否进行了一个全表的扫描。(如果在命中不理想的情况下,也可以使用force index(index_name)来进行强制的使用)

你可能感兴趣的:(java)