从b树到数据库,自己乱写

完全二叉树:满二叉树,连续缺失

搜索二叉树:左比根小,右比根大



B树是为了磁盘或者其他存储设备而设计的一种多叉多关键字的平衡查找树,

一颗m阶的B树是一颗平衡的m路搜索树,或者是空树,满足以下性质
单个结点的关键字最大个数为max=m-1,min=【m/2】-1
1.根节点至少有两个子女
2。每个非根节点所包含的关键字个数 j 满足对 【m/2】-1<=j<=m-1) (【】表示向上取整)
3.除过根节点和叶子节点的度数是关键字总数加一,
所有的叶子节点处于同一层(类似于红黑树,指的是空节点)



B树的查找

在B树上的查找是一个查找节点和在节点内的关键字查找交叉进行的过程,从根节点开始
在节点包含的关键字中查找给定的关键字,找到那么查找成功,否则确定给定关键字可能在
得子树,重复操作,直到查找成功或者确定为空为止,

如上图查找21,先在根节点查询,没有21,比20大比30小,确定到20的右子树,在继续查找



B树的插入

首先通过查找,找到可插入的恰当位置,在恰当的叶子节点中添加关键字,如果节点中关键字
不超过最大度数,那么插入成功。否则把结点分为两个。并且把中间的一个关键字拿出来
插到结点的父节点中去。父节点也可能是满的就需要在分裂,如此循环,最差的情况,一直传到
根节点,需要分裂根,根没有父节点,此时新建一个根,整个树高度加一

上图是插入33的过程,先找到30,去他的右子树,看度数到达了没有,如果到达那么分裂这个结点
将中间关键字放到父节点,将这个结点从中间一分为二,插入关键字33



删除:

1.当被删除的关键字key所在节点node并非是最底层的节点

step1:找到被删除关键字key在节点node中的位置idx
step2:找到以子节点child=node->child[index]为根节点的子树
step3:找到子树的最大关键字key2,并且将key2拿去填充被删除关键字的
位置
删除关键字30,这是一颗三阶树,每个节点最大关键字数为2,最小为1
要删除30,不是最底层的结点,那么找到child=node->child[index]为根节点的子树,那么
找到左边,最大值为22,删除22

被删除关键字key所在节点node为最底层结点时

(1)删除操作前结点node的关键字个数num>【m/2】-1时,则进行删除操作后,结点关键字
个数仍处在min<=num<=max的范围时,操作结束


(2)删除操作前结点node的关键字个数num=【m/2】-1时,则进行删除操作后,结点node的
的关键字个数num<【m/2】-1,不符合B树特征,此时有两种情况
1:如果结点noded的兄弟结点Brother的结点个数num>[m/2]-1时,结点node可以向
brother借用一个结点,但需要以父节点的关键字为跳板,此时删除操作完成

删除20的操作:20在最后一层,删除之后结点不符合B树特征,向兄弟结点借17,以父节点18为跳板
将18放下来,17放上去

如果结点node的兄弟结点的关键字个数num=【m/2】-1,那么将node和brother合并为一个
新的结点new,同时将父节点parent中夹在node和brother之间的关键字插入到新节点new中
如果父节点插入一个到new之后关键字num>[m/2]-1,删除完成
如果父节点的关键字个数num【m/2】-1,那么推到情况一,直到合适


删除16,合并18,将17挪下来







B+树
1,B+树是B树的变体,也是一种多路搜索树
2,非叶子节点的子树个数与和关键字个数相同
3,非叶子节点的子树指针P[i],指向关键字属于[K[i],K[i+1]]的子树
4,为所有叶子节点增加一个链指针,(每个叶子节点增加一个指向相邻叶子节点的指针,可以顺序的f访问B+树,提高访问效率)
5,所有的关键字都在叶子出现(父节点的关键字会出现在子节点中,并且层层传递)


在mySql中用B+树做索引,但在实现上有根据聚簇索引和非聚簇索引而不同

聚簇索引是主索引文件和数据文件为同一份文件,聚簇索引主要引用在Innodb中对于
Innodb存储引擎来说,只有一个数据文件,这个数据文件本身就是B+树得形式,
B+树得每个节点的关键字就是表得主键,因此Innodb数据文件本身就是主索引文件
主索引中的叶子包含了数据记录,但非叶子节点只包含了主键,这种索引方式,可以提高数据的
访问速度,因为索引和数据保存在一颗B+书中,从聚簇索引中获取数据通常比在非聚簇索引中来的块
,这也是Innodb引擎创建的表必须指定主键的原因。如果没有显式指定主键,Innodb仍然会对该表隐式地定义一个主键作为聚簇索引。

非聚簇索引
B+树的叶子上并不存数据本身,而存的是数据存放的地址,


聚簇索引是指 如果一组表有一些共同的列,则将这样一组表存储在相同放入数据库块中
聚簇还表示把相关的数据存储在同一个块上。利用聚簇,一个块可能包含多个表的数据,概念上就是
如果两个表经常做连接操作,可以预先把数据存储在一起。还可以用于单个表,可以将
某个列的数据分组存储,


聚簇和非聚簇的区别:
1.一个表只能有一个聚簇索引
2.可以对一张表同时建立聚簇索引和非聚簇索引
3.非聚簇索引需要大量的空间、
4.非聚簇索引可以提高读取效率,会降低向表中插入和更新的速度

非聚簇索引的使用:
1、某列常用于集合函数(如Sum,....)。
2、某列常用于join,order by,group by。


聚簇索引的使用
1、主键列,该列在where子句中使用并且插入是随机的。
2、按范围存取的列,如pri_order > 100 and pri_order < 200。
3、在group by或order by中使用的列。
4、不经常修改的列。
5、在连接操作中使用的列。


创建索引
create unique index 索引名 on 表名(列名)



红黑树需要满足的性质;
1.节点不是红色就是黑色
2.根节点是黑的
3.每个叶子节点都是黑色(空节点)
4.每个红色的节点的两个叶子节点都是黑色的
5.从任意一个节点到其每个叶子节点的所有路径都包含相同数目的黑色结点



数据库Myisam和innodb

、存储结构 
每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。 
.frm文件存储表定义。 
数据文件的扩展名为.MYD (MYData)。 
索引文件的扩展名是.MYI (MYIndex)。
2、存储空间 
MyISAM:可被压缩,存储空间较小。 
InnoDB:需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引。 
MyISAM的索引和数据是分开的,并且索引是有压缩的,内存使用率就对应提高了不少。能加载更多索引,而Innodb是索引和数据是紧密捆绑的,没有使用压缩从而会造成Innodb比MyISAM体积庞大不小
3、事务处理 
MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不支持外键、不提供事务支持。 
InnoDB提供事务支持事务,外部键(foreign key)等高级 数据库 功能。
4、表的具体行数 
MyISAM:保存有表的总行数,如果select count(*) from table;会直接取出该值。 
InnoDB:没有保存表的总行数,如果使用select count(*) from table;就会遍历整个表,消耗相当大,但是在加了where后,myisam和innodb处理的方式都一样。
两种类型最主要的差别就是Innodb 支持事务处理与外键和行级锁


mysql加锁:乐观 悲观
悲观 加forUpdate
乐观 加版本号
1、对actor表获得读锁:mysql> lock table actor read; 
2、通过别名访问会提示错误: 
mysql> select a.first_name,a.last_name from actor a ; 
ERROR 1100 (HY000): Table ‘a’ was not locked with LOCK TABLES 
3、需要对别名分别锁定:mysql> lock table actor as a read; 
4、此时可以正确执行:select a.first_name,a.last_name from actor a ;

innodb
·排他锁(X):SELECT * FROM table_name WHERE …  FOR UPDATE

不同的事务可以使用不同的索引锁定不同的行

只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁!








内外连接

select * from t1 left join t2 on t1.id=t2.id;
select * from t1 right join t2 on t1.id=t2.id;

左外连接是以左边的表为基准。通俗的讲,先将左边的表全部显示出来,然后右边的表id与左边表id相同的记录就“拼接”上去,比如说id为1的记录。如果没有匹配的id,比如说t1中id为2的t2中就没有。那边就以null显示。右外连接过程正好相反。




select * from t1 inner join t2 on t1.id=t2.id;
内连接就是只取出符合过滤条件的记录 也就是t1.id=t2.id 那么符合t1.id=t2.id的记录只有id=1这一条,所以只显示一条。 不像外连接,是将你作为基准的表(左外连接就是左边表为基准,右外连接就是右边表为基准)的所有行都显示出来。

MyISAM在执行查询语句(SELECT)前, 会自动给涉及的所有表加读锁 ,在执行更新操作(UPDATE、DELETE、INSERT等)前, 会自动给涉及的表加写锁 ,这个过程并不需要用户干预,因此,用户一般不需要直接用LOCK TABLE命令给MyISAM表显式加锁。 


、v

数据库事物的特性:
原子性:要么全部成功要么全部失败
一致性:
隔离性:多个用户并发访问数据库时,操作同一张表时,为每一个用户开启一个事物,其他事物不能干扰,多个并发事物要相互隔离
持久性:一旦被提交,数据库中的数据的改变是永久性的

数据库的隔离级别:

串行化:可避免脏读,不可重复读,幻读,
可重复读:可避免脏读,不可重复读
读已提交:避免脏读
读未提交:什么都无法保证
set session transaction isolatin level repeatable read;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值