B树和B+树
B树的特点: (平衡的多路查找树)
1.对节点进行了排序
2.一个节点可以存多个元素(元素也进行了排序)
B+树的特点:
1.拥有B树的所有特点
2.叶子节点之间有指针
3.非叶子节点上的元素在叶子节点上都有冗余,也就是说叶子节点中存储了所有元素.并且进行了排序
总结:
1.mysql索引使用的是B+树,因为索引是用来加快查询的,而B+树通过对数据进行排序,提高了查询效率
2.通过一个节点中可以存储多个元素,从而可以使得B+树的高度不会太高
3.在mysql中innerdb默认为16kb,所以一般情况下一颗两层的B+树可以存2000万行左右的数据
4.叶子节点之间有指针,可以很好的支持全表扫描,范围查询等sql语句
为什么使用B+树而不是b树?
1.B树适合随机检索,b+树适合随机检索和顺序检索。b+树的空间利用率更高,因为b树每个节点都要存储键和值,b+树内部只存储键,b+树一个节点可以存储更多的索引,内部树的高度变低,减少io的次数。检索更快。
2.性能稳定。b+树中,每次查询都是从根节点到叶子节点,b树的话,有可能不在叶子节点,在内部节点就已经找到,
索引
索引是帮助MySQL高效获取数据的排好序的数据结构。对数据库表的一列或多列的值进行排序的一种结构。
优点:大大加快数据检索速度。随机IO变成顺序IO。(b+树叶子节点都是连接在一起的)
缺点: 空间角度来说,建立索引需要占用物理空间。时间角度来说,创建和维护都需要花费时间。
索引的数据结构主要有b+树和哈希表,对应B+树索引和哈希索引。同样innoDB的索引包括这两种,默认是b+树索引。
哈希索引不支持排序,因为哈希表是无序的。
哈希索引不支持范围查找。
索引种类主要有:主键索引,组合索引,唯一索引,全文索引,普通索引。
键
1、书中的定义 超键(super key): 在关系中能唯一标识元组的属性集称为关系模式的超键
候选键(candidate key): 不含有多余属性的超键称为候选键。也就是在候选键中,若再删除属性,就不是键了!
主键(primary key): 用户选作元组标识的一个候选键程序主键
外键(foreign key):如果关系模式R中属性K是其它模式的主键,那么k在模式R中称为外键。
2、咱们创建简单的两个表,说明一下各个键!
学生信息(学号 身份证号 性别 年龄 身高 体重 宿舍号)和 宿舍信息(宿舍号 楼号)
超键:只要含有“学号”或者“身份证号”两个属性的集合就叫超键,例如R1(学号 性别)、R2(身份证号 身高)、R3(学号 身份证号)等等都可以称为超键!
候选键:不含有多余的属性的超键,比如(学号)、(身份证号)都是候选键,又比如R1中学号这一个属性就可以唯一标识元组了,而有没有性别这一属性对是否唯一标识元组没有任何的影响!
主键:就是用户从很多候选键选出来的一个键就是主键,比如你要求学号是主键,那么身份证号就不可以是主键了!
外键:宿舍号就是学生信息表的外键
Union和union all的区别
Union因为要进行重复值扫描,所以效率低。如果合并没有刻意要删除重复行,那么就使用Union All
Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;
Union All:对两个结果集进行并集操作,包括重复行,不进行排序;
Intersect:对两个结果集进行交集操作,不包括重复行,同时进行默认规则的排序;
Minus:对两个结果集进行差操作,不包括重复行,同时进行默认规则的排序。
事务
数据库中的事务是指对数据库执行一批操作,在同一个事务当中,这些操作最终要么全部执行成功,要么全部失败,不会存在部分成功的情况。
四大特性:原子性,隔离性,持久性,一致性
原子性:事务的整个过程如原子操作一样,最终要么全部成功,或者全部失败。
一致性:一个事务必须使数据库从一个一致性状态变换到另一个一致性状态。
隔离性:一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
持久性:一个事务一旦提交,他对数据库中数据的改变就应该是永久性的。
注意的是,mysql中事务默认是隐式事务,执行insert、update、delete操作的时候,数据库自动开启事务、提交或回滚事务。
是否开启隐式事务是由变量autocommit控制的。
所以事务分为隐式事务和显式事务。
几个重要问题:
脏读:个事务在执行的过程中读取到了其他事务还没有提交的数据。
幻读:事务中后面的操作(插入号码X)需要上面的读取操作(查询号码X的记录)提供支持,但读取操作却不能支持下面的操作时产生的错误,就像发生了幻觉一样。
事务隔离级别
读未提交:READ-UNCOMMITTED
读已提交:READ-COMMITTED
可重复读:REPEATABLE-READ
串行:SERIALIZABLE
锁
锁是计算机协调多个进程或线程并发访问某一资源的机制。
共享锁和排他锁:
共享锁(读锁):其他事务可以读,但不能写。
排他锁(写锁) :其他事务不能读取,也不能写。
InnoDB加锁方法:
意向锁是 InnoDB 自动加的, 不需用户干预。
对于 UPDATE、 DELETE 和 INSERT 语句, InnoDB会自动给涉及数据集加排他锁(X);