Mysql三种搜索引擎
Memory
MEMORY是MySQL中一类特殊的存储引擎。它使用存储在内存中的内容来创建表,而且数据全部放在内存中。
底层使用hash和B-树
MyISAM
底层使用B树
采用表级锁来提供并发支持能力
执行读取操作的速度很快,而且不占用大量的内存和存储资源
数据和索引分开存储,减少操作系统的大文件访问情况,以提高性能
单独存储了表的行数数据,统计行数的不用遍历数据
不支持事务
InnoDB
InnoDB为mysql默认的搜索引擎,InnoDB给MySQL的表提供了事务处理、回滚、崩溃修复能力和多版本并发控制的事务安全。现在是mysql的默认存储引擎。使用B+树作为底层
与其它存储引擎不同,InnoDB表能够自动从灾难中恢复,MySQL支持外键的存储引擎只有InnoDB
B+树结构
B+树是应数据所需而出现的一种B树的变形树。一棵m阶的B+树需要满足下列条件:
每个分支节点最多有m棵子树(孩子节点);
非叶根节点至少有两棵子树,其他每个分支节点至少有⌈m/2⌉棵子树;
节点的字数个数与关键字个数相等;
所有叶节点包含全部关键字及指向相应记录的指针,叶节点中将关键字按大小顺序排列,并且相邻叶节点按大小顺序相互链接起来;
所有分支节点(可视为索引的索引)中仅包含他的各个子节点(即下一级的索引块)中关键字的最大值及指向其子节点的指针。
在B+树中,叶节点包含信息,所有非叶节点仅起索引作用,非叶节点的每个索引项只含有对应子树的最大关键字和指向该子树的指针,不含有该关键字对应记录的存储地址。
存储过程
存储过程的定义
存储过程是一组为了完成特定功能的SQL语句集,它存储在数据库中,并允许用户通过指定的名字来调用这组语句集。存储过程可以包含逻辑控制语句、数据操作语句等,并且可以接收输入参数和返回输出结果。
存储过程的创建和执行
创建存储过程:
使用CREATE PROCEDURE语句来创建存储过程。
在创建过程中,可以定义输入参数、输出参数和存储过程的主体(即SQL语句集)。
执行存储过程:
使用CALL语句来执行存储过程。
可以传递必要的输入参数给存储过程,并接收其返回的输出结果。
聚集索引与普通索引
聚集索引
定义:数据行的物理顺序与列值(一般是主键的那一列)的 逻辑顺序相同,一个表中只能拥有一个聚集索引。
聚集索引的好处了,索引的 叶子节点就是对应的数据节点,可以直接获取到对应的全部列的数据,而非聚集索引在索引没有覆盖到对应的列的时候需要进行二次查询
如果不创建索引,系统会自动创建一个隐含列作为表的聚集索引,MySQL里主键就是聚集索引
非聚集索引
定义:该索引中索引的逻辑顺序与磁盘上行的物理存储顺序不同,一个表中可以拥有多个非聚集索引。非聚集索引,分成普通索引,唯一索引,全文索引
非聚集索引叶节点仍然是索引节点,只是有一个指针指向对应的数据块,此如果使用非聚集索引查询,而查询列中包含了其他该索引没有覆盖的列,那么他还要进行第二次的查询,查询节点上对应的数据行的数据。
事务管理
事务的特性ACID
原子性(Atomicity):原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
一致性(Consistency):事务前后数据的完整性必须保持一致。
隔离性(isolation):事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
持久性(durability):持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响
问题
脏读: 对于两个事务 T1, T2, T1 读取了已经被 T2 更新但还**没有被提交**的字段。之后, 若 T2 回滚, T1读取的内容就是临时且无效的。
不可重复读: 对于两个事务T1, T2, T1 读取了一个字段, 然后 T2 **更新**了该字段。之后, T1再次读取同一个字段, 值就不同了。
幻读: 对于两个事务T1, T2, T1 从一个表中读取了一个字段, 然后 T2 在该表中**插入**了一些新的行。之后, 如果 T1 再次读取同一个表, 就会多出几行。
隔离级别,mysql默认可重复读
未提交读(READ-UNCOMMITTED),事务中发生了修改,即使没有提交,其他事务也是可见的,比如对于一个数A原来50修改为100,但是我还没有提交修改,另一个事务看到这个修改,而这个时候原事务发生了回滚,这时候A还是50,但是另一个事务看到的A是100.可能会导致脏读、幻读或不可重复读
提交读(READ-COMMITTED),对于一个事务从开始直到提交之前,所做的任何修改是其他事务不可见的,举例就是对于一个数A原来是50,然后提交修改成100,这个时候另一个事务在A提交修改之前,读取的A是50,刚读取完,A就被修改成100,这个时候另一个事务再进行读取发现A就突然变成100了;可以阻止脏读,但是幻读或不可重复读仍有可能发生
可重复读(REPEATABLE-READ),就是对一个记录读取多次的记录是相同的,比如对于一个数A读取的话一直是A,前后两次读取的A是一致的;可以阻止脏读和不可重复读,但幻读仍有可能发生。
可串行化读(SERIALIZABLE),在并发情况下,和串行化的读取的结果是一致的,没有什么不同,比如不会发生脏读和幻读;该级别可以防止脏读、不可重复读以及幻读。
Spring中的事务管理
Spring事务通过管理注解@Transactional控制业务层方法的事务。
异常回滚的属性:rollbackFor
默认情况下,只有出现RuntimeException(运行时异常)才会回滚事务。
假如我们想让所有的异常都回滚,需要来配置@Transactional注解当中的rollbackFor属性,通过rollbackFor这个属性可以指定出现何种异常类型回滚事务。
@Transactional注解当中的rollbackFor属性用于控制出现何种异常类型,回滚事务。
事务传播行为:propagation
@Transactional注解当中的第二个属性propagation,这个属性是用来配置事务的传播行为的。
什么是事务的传播行为呢?
指的就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行事务控制。
要研究事务的传播行为,至少得有两个事务(嵌套事务)
事务传播行为定义了在方法调用链中嵌套事务的创建和使用方式
我们要想控制事务的传播行为,在@Transactional注解的后面指定一个属性propagation,通过 propagation 属性来指定传播行为。