Welcome to the website navigation,本站只接受合法正规的企业网站,欢迎站长们提交你的网站获得展示和流量有任何问题请联系站长,欢迎大家加入本站。

                
提交网站
  • 网站:76083
  • 待审:5
  • APP:577
  • 文章:304411
  • 会员:56004
文字内链包年1000元 文字内链包年1000元 文字内链包年1000元 AI办公网站 AI绘画工具 AIchat

基于B-树和B 树的使用:数据搜索和网站数据库索引的详细介绍88HAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

1 .B-树定义,B-树是一种平衡的多路查找树,它在网站网站文件系统中很有用。,定义:一棵m 阶的B-树,或者为空树,或为满足下列特性的m 叉树: ⑴树中每个结点至多有m 棵子树; ⑵若根结点不是叶子结点,则至少有两棵子树;,⑶除根结点之外的所有非终端结点至少有[m/2] 棵子树; ⑷所有的非终端结点中包含以下信息数据:,(n,A0,K1,A1,K2,…,Kn,An) 其中:Ki(i=1,2,…,n)为关键码,且Ki,Ai 为指向子树根结点的指针(i=0,1,…,n),且指针Ai-1 所指子树中所有结点的关键码均小于Ki (i=1,2,…,n),An 所指子树中所有结点的关键码均大于Kn.,n 为关键码的个数。 ⑸所有的叶子结点都出现在同一层次上,并且不带信息(可以看作是外部结点或查找失败的结点,实际上这些结点不存在,指向这些结点的指针为空)。,即所有叶节点具有相同的深度,等于树高度。,如一棵四阶B-树,其深度为4., , , ,B-树的查找类似二叉排序树的查找,所不同的是B-树每个结点上是多关键码的有序表,在到达某个结点时,先在有序表中查找,若找到,则查找成功;否则,到按照对应的指针信息指向的子树中去查找,当到达叶子结点时,,在上图的B-树上查找关键字47的过程如下:,1)首先从更开始,根据根节点指针找到 *节点,因为 *a 节点中只有一个关键字,且给定值47 > 关键字35,则若存在必在指针A1所指的子树内。,2)顺指针找到 *c节点,该节点有两个关键字(43和 78),而43 < 47 < 78,若存在比在指针A1所指的子树中。,3)同样,顺指针找到 *g节点,在该节点找到关键字47,查找成功。,2. 查找算法,复制具体相关代码 具体相关代码如下:,typedef int KeyType ; #define m 5 /*B 树的阶,暂设为5*/ typedef struct Node{ int keynum; /* 结点中关键码的个数,即结点的大, ,从查找算法中可以看出, 在B- 树中进行查找包含两种基本操作办法:,( 1) 在B- 树中查找结点;,( 2) 在结点中查找关键字。,由于B- 树通常存储在磁盘上, 则前一查找操作办法是在磁盘上进行的, 而后一查找操作办法是在内存中进行的, 即在磁盘上找到指针p 所指结点后, 先将结点中的信息读入内存, 然后再利用顺序查找或折半查找查询等于,因此, 在磁盘上进行查找的次数、即待查找关键字所在结点在B- 树上的层次树, 是决定B树查找效率的首要因素,那么,对含有n 个关键码的m 阶B-树,最坏情况下达到多深呢?可按二叉平衡树进行类似分析。首先,讨论m 阶B-数各层上的最少结点数。,由B树定义:B树包含n个关键字。因此有n 1个树叶都在第J 1 层。,1)第一层为根,至少一个结点,根至少有两个孩子,因此在第二层至少有两个结点。,2)除根和树叶外,其它结点至少有[m/2]个孩子,因此第三层至少有2*[m/2]个结点,在第四层至少有2*[m/2]2 个结点…,3)那么在第J 1层至少有2*[m/2]J-1个结点,而J 1层的结点为叶子结点,于是叶子结点的个数n 1。有:, ,也就是说在n个关键字的B树查找,从根节点到关键字所在的节点所涉及的节点数不超过:, ,3.B-树的插入,B-树的生成也是从空树起,逐个插入关键字而得。但由于B-树结点中的关键字个数必须≥ceil(m/2)-1,因此,每次插入一个关键字不是在树中添加一个叶子结点,而是首先在最低层的某个非终端结点中添加一个,如图(a) 为3阶的B-树(图中略去F结点(即叶子结点)),假设需依次插入关键字30,26,85。, , , ,1) 首先通过查找确定插入的位置。由根*a 起进行查找,确定30应插入的在*d 节点中。由于*d 中关键字数目不超过2(即m-1),故第一个关键字插入完成:如(b), , ,2) 同样,通过查找确定关键字26亦应插入 *d. 由于*d节点关键字数目超过2,此时需要将 *d分裂成两个节点,关键字26及其前、后两个指针仍保留在 *d 节点中,而关键字37 及其前、后两个指针存, , , , ,3) (e) -(g) 为插入85后;, , ,插入算法:,复制具体相关代码 具体相关代码如下:88HAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

1、假如如果同时从同一个客户端插入很多行,使用含多个 VALUE的INSERT数据库语句同时插入几行。这比使用单行INSERT数据库语句快(在某些情况下快几倍)。假如如果您正向一个非空表添加数据,可以调节 bulk_insert_buffer_size变量,使数据插入更快。参见5.3.3 节,“站点服务器系统变量”。    2、假如如果您从不同的客户端插入很多行,能通过INSERT DELAYED数据库语句加快速度。参见13.2.4 节,“INSERT语法”。    3、用MyISAM,假如如果在表中没有删除的行,能在SELECT数据库语句正在运行的同时插入行。    4、当从一个文本网站网站文件装载一个表时,使用LOAD DATA INFILE。这通常比使用很多INSERT数据库语句快20倍。参见13.2.5 节,“LOAD DATA INFILE语法”。    5、当表有很多索引时,有可能要多做些工作使得LOAD DATA INFILE更快些。使用下列过程:    1). 有选择地用CREATE TABLE创建表。  2). 执行FLUSh TABLES数据库语句或开始执行命令mysqladmin flush-tables。  3). 使用myisamchk --keys-used=0 -rq /path/to/db/tbl_name。这将从表中取消所有索引的使用。  4). 用LOAD DATA INFILE把数据插入到表中,因为不更新任何索引,因此很快。  5). 假如如果只想在以后读取表,使用myisampack压缩它。参见15.1.3.3 节,“压缩表特性”。  6). 用myisamchk -r -q /path/to/db/tbl_name重新创建索引。这将在写入磁盘前在内存中创建索引树,并且它更快,因为避免了大量磁盘搜索。结果索引树也被完美地平衡。  7). 执行FLUSh TABLES数据库语句或mysqladmin flush-tables开始执行命令。    6、锁定表可以加速用多个数据库语句执行的INSERT操作办法:    * LOCK TABLES a WRITE;  * INSERT INTO a VALUES (1,23),(2,34),(4,33);  * INSERT INTO a VALUES (8,26),(6,29);  * UNLOCK TABLES;    这样性能会提高,因为索引数据缓存区仅在所有INSERT数据库语句完成后刷新到磁盘上一次。一般有多少INSERT数据库语句即有多少索引数据缓存区刷新。假如如果能用一个数据库语句插入所有的行,就不需要锁定。    对于事务表,应使用BEGIN和COMMIT代替LOCK TABLES来加快插入。

标签:

分享到:

  网友投稿

注册时间:

网站:0 个   APP:0 个  文章:0 篇

  • 76083

    网站

  • 577

    APP

  • 304411

    文章

  • 56004

    会员

赶快注册账号,推广您的网站吧!
文章分类
热门网站
最新入驻APP小程序

宝贝市场2023-02-08

宝贝市场——买手和卖家商品展示

夺宝助手2023-02-08

夺宝助手小程序,查看每日快夺宝平

查诚信2023-02-08

查诚信是一款免费的商业查询工具

车价天天报2023-02-08

快速连接汽车销售,获知汽车最新报

考勤助理小程序2023-02-08

上班签到考勤,实时定位,后台轻松

汽车报价大全查询2023-02-08

汽车报价大全查询提供最新汽车市