其次,B+树。B树、B-树、B+树、B*树。B树是二叉搜索树,B-树、B+树、B*树都是多路搜索树。B-树定义了基本的规范,它有个特点,关键字出现在非叶子节点或者叶子节点,子树的指针比关键字个数大一个。B+树在这两方面分别做了升级,定义如下:
B+树是B-树的变体,也是一种多路搜索树:
1.其定义基本与B-树同,除了:
2.非叶子结点的子树指针与关键字个数相同;
3.非叶子结点的子树指针P[i],指向关键字值属于[K[i], K[i+1])的子树
(B-树是开区间);
5.为所有叶子结点增加一个链指针;
6.所有关键字都在叶子结点出现;
B+的搜索与B-树也基本相同,区别是B+树只有达到叶子结点才命中(B-树可以在非叶子结点命中),其性能也等价于在关键字全集做一次二分查找;
B+的特性:
1.所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好是有序的;
2.不可能在非叶子结点命中;
3.非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储(关键字)数据的数据层;
4.更适合文件索引系统;
最后B*树,它是B+树的变体,在B+树的非根和非叶子结点再增加指向兄弟的指针。
B*树定义了非叶子结点关键字个数至少为(2/3)*M,即块的最低使用率为2/3(代替B+树的1/2);
B+树的分裂:当一个结点满时,分配一个新的结点,并将原结点中1/2的数据复制到新结点,最后在父结点中增加新结点的指针;B+树的分裂只影响原结点和父结点,而不会影响兄弟结点,所以它不需要指向兄弟的指针;
B*树的分裂:当一个结点满时,如果它的下一个兄弟结点未满,那么将一部分数据移到兄弟结点中,再在原结点插入关键字,最后修改父结点中兄弟结点的关键字(因为兄弟结点的关键字范围改变了);
如果兄弟也满了,则在原结点与兄弟结点之间增加新结点,并各复制1/3的数据到新结点,最后在父结点增加新结点的指针;
所以,B*树分配新结点的概率比B+树要低,空间使用率更高;
3、如何在Navicat中对表添加索引?
#删除表
DROP TABLE test.idc_work_order_main
# 创建表结构idc_work_order_main
CREATE TABLE `idc_work_order_main` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`creator` varchar(128) NOT NULL DEFAULT '0' COMMENT '创建人',
`gmt_create` timestamp NULL DEFAULT NULL COMMENT '创建时间',
`modifier` varchar(128) DEFAULT '0' COMMENT '修改人',
`gmt_modified` timestamp NULL DEFAULT NULL COMMENT '修改时间',
`title` varchar(64) DEFAULT NULL COMMENT '工单标题',
`category` varchar(32) DEFAULT NULL COMMENT '工单类别',
`subject` varchar(32) DEFAULT NULL COMMENT '工单类型',
`demander` varchar(30) DEFAULT NULL COMMENT '需求方',
`is_atomic` char(1) DEFAULT 'y' COMMENT '是否原子工单',
`atomic_id` int(11) DEFAULT NULL COMMENT '当前原子工单在列表中ID',
`site` varchar(50) DEFAULT NULL COMMENT '工单所在机房',
`operationer` varchar(32) DEFAULT NULL COMMENT '当前处理人',
`operation_role` varchar(50) DEFAULT NULL COMMENT '当前处理角色',
`state` varchar(50) DEFAULT NULL COMMENT '工单状态',
`sub_state` varchar(50) DEFAULT NULL COMMENT '工单子状态',
`expect_time` timestamp NULL DEFAULT NULL COMMENT '预期结单时间',
`sla` bigint(20) DEFAULT NULL COMMENT 'sla',
`evaluation` varchar(200) DEFAULT NULL COMMENT '评价',
`create_source` varchar(32) DEFAULT 'TBOSS' COMMENT '创建源',
`source_key` varchar(32) DEFAULT NULL COMMENT '创建源唯一标示',
`is_deleted` char(1) DEFAULT 'n' COMMENT '是否已删除y,n',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
`parent_id` int(11) DEFAULT '0' COMMENT '父工单ID',
`asset_total` int(11) DEFAULT '0' COMMENT '设备总数',
`sla_standard` double DEFAULT NULL COMMENT '标准时间',
`sla_unit` char(1) DEFAULT NULL COMMENT 'sla 单位',
`effective_date` timestamp NULL DEFAULT NULL COMMENT '提单时间(生效时间)',
`is_timeout` char(1) DEFAULT 'n' COMMENT '是否超时,‘y’超时,‘n’未超时',
`statement_date` timestamp NULL DEFAULT NULL COMMENT '结单的时间',
`source_creator` varchar(32) DEFAULT NULL COMMENT '第三方创建人信息(域账号)',
`atomic_order_id` int(11) DEFAULT NULL COMMENT '当前原子工单编号',
`order_device_type` varchar(50) DEFAULT 'SERVER' COMMENT '工单设备类型(server=服务器,network_serve等)',
`finish_asset_total` int(11) DEFAULT '0' COMMENT '完成设备数',
PRIMARY KEY (`id`),
KEY `idx_statement_date` (`statement_date`),
KEY `idx_parent_id` (`parent_id`),
KEY `idx_gmt_modified` (`gmt_modified`),
KEY `idx_gmt_create` (`gmt_create`)
) ENGINE=InnoDB AUTO_INCREMENT=182431 DEFAULT CHARSET=utf8 COMMENT='工单主表';
#显示建表信息
SHOW CREATE TABLE idc_work_order_main