MySQL中索引和优化的用法总结(2)

  其次,B+树。B树、B-树、B+树、B*树。B树是二叉搜索树,B-树、B+树、B*树都是多路搜索树。B-树定义了基本的规范,它有个特点,关键字出现在非叶子节点或者叶子节点,子树的指针比关键字个数大一个。B+树在这两方面分别做了升级,定义如下:

MySQL中索引和优化的用法总结

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+树的分裂只影响原结点和父结点,而不会影响兄弟结点,所以它不需要指向兄弟的指针;

MySQL中索引和优化的用法总结

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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/de6f53e515badd38d73a22dd8dcfd410.html