mysql索引b树和b树的区别,mysql索引为什么用b+树而不是b树

  mysql索引b树和b树的区别,mysql索引为什么用b+树而不是b树

  可以通过两种方式创建和删除索引;一个是alter table,另一个是create /drop index.alter table创建索引的语法:

  更改表tbl_name

  添加{INDEXKEY} {INDEX_NAME}

  {索引类型}(索引列名,)[索引选项]..

  删除{INDEXKEY}INDEX_NAME

  索引可以索引整列的数据,也可以只索引列首的数据,比如我们前面创建的表T,列B是varchar(8000),我们只索引前100个字段,比如;

  MySQL alter table t add key idx _ b(b(100));

  查询正常,0行受影响(0.05秒)

  记录:0重复项:0警告:0

  关系型数据库

  目前mysql数据库普遍存在一个问题。对于所有添加或删除索引的操作,mysql数据库首先创建一个新的临时表,然后将数据导入临时表,删除原表,再将临时表重命名为原表名。因此,对于大型表,添加和删除索引需要很长时间。

  Innodb存储引擎支持版本innodb插件的快速索引创建方法;当然,这种方法只限于二级索引。对于主键的创建和删除,仍然需要重新创建一个表。为了创建二级索引,innodb存储引擎将在表中添加一个S锁。在创建过程中,不需要重建表格,所以速度极快。但是在创建过程中,由于S锁,只能在创建过程中读取表,删除二级索引比较容易。只需要更新innodb的内部视图,将二级索引的空间标记为可用,在mysql的内部视图上删除表的索引定义即可。

  要查看表中索引的信息,可以使用show index语句。例如,如果我们分析表T,在它之前添加一个联合索引,例如:

  MySQL alter table t add key idx _ a _ b(a,c);

  查询正常,0行受影响(0.12秒)

  记录:0重复项:0警告:0

  mysql显示来自tG的索引;

  *************************** 1.第*************************行

  表:t

  非唯一:0

  Key_name:主要

  序列索引:1

  列名:a

  排序规则:A

  基数:4

  子部件:空

  打包:空

  空:

  索引类型:BTREE

  评论:

  索引_注释:

  *************************** 2.第*************************行

  表:t

  非唯一:1

  密钥名称:idx_c

  序列索引:1

  列名:c

  排序规则:A

  基数:4

  子部件:空

  打包:空

  空:

  索引类型:BTREE

  评论:

  索引_注释:

  *************************** 3.第*************************行

  表:t

  非唯一:1

  密钥名称:idx_b

  序列索引:1

  列名:b

  排序规则:A

  基数:4

  子部分:100

  打包:空

  空:是

  索引类型:BTREE

  评论:

  索引_注释:

  *************************** 4.第*************************行

  表:t

  非唯一:1

  密钥名称:idx_a_b

  序列索引:1

  列名:a

  排序规则:A

  基数:4

  子部件:空

  打包:空

  空:

  索引类型:BTREE

  评论:

  索引_注释:

  *************************** 5.第*************************行

  表:t

  非唯一:1

  密钥名称:idx_a_b

  序列索引:2

  列名:c

  排序规则:A

  基数:4

  子部件:空

  打包:空

  空:

  索引类型:BTREE

  评论:

  索引_注释:

  一组5行(0.00秒)

  错误:

  未指定查询

  关系型数据库

  表中有3个索引;主键索引、A列和C列上的索引以及b列中由前100个字节组成的索引。下面是每列的定义:

  Table:索引所在的表的名称;

  Non_unique:非唯一索引。可以看到主键是0,因为必须唯一;

  Key_name:索引的名称,通过它我们可以删除索引;

  Seq_in_index:该列在索引中的位置,如果看联合索引idx_a_c更直观;

  Column_name:索引的列;

  排序规则:列在索引中的存储方式,可以是或“NULL”。B树索引始终是A,即排序。如果使用堆存储引擎,建立哈希索引,这里会显示NULL,因为哈希是按照哈希桶存储索引数据,而不是对数据进行排序;

  基数:非常关键的值,表示索引中唯一值的数目的估计值基数/(表的行数)应尽可能接近1,如果非常小,那么需要考虑是否需要重建这个索引。

  子零件:是否是列的部分索引,如果是就显示数字,如果是索引整个列,则该字段为空

  包装:关键字如何被压缩,如果没有被压缩,则为空

  空:是否索引的列含有空值,可以看到idx_b这里为是的,因为我们定义了b列运行为空;

  索引类型:索引的类型;引擎存储引擎只支持B树索引,所以这里显示的都是索引的存储类型目前只有两种

  评论:注释;

  基数的值非常关键,优化器会根据这个值来判断是否使用这个索引,但是这个值并不是事实更新的,并非每次索引的更新,该值都会更新,因为代价大,因此这个值不太准确,只是一个大概的值;

  如果需要更新索引基数的信息,可以使用分析表格命令;如;

  关系型数据库分析表t G;

  *************************** 1.第*************************行

  表:测试

  Op:分析

  消息类型:状态

  消息_文本:好

  集合中的一行(0.01秒)

  错误:

  未指定查询

  关系型数据库显示来自tG的索引;

  *************************** 1.第*************************行

  表:t

  非唯一:0

  密钥名称:主要

  序列索引:1

  列名:a

  排序规则:A

  基数:5

  子部件:空

  打包:空

  空:

  索引类型:BTREE

  评论:

  索引_注释:

  *************************** 2.第*************************行

  表:t

  非唯一:1

  密钥名称:idx_c

  序列索引:1

  列名:c

  排序规则:A

  基数:5

  子部件:空

  打包:空

  空:

  索引类型:BTREE

  评论:

  索引_注释:

  *************************** 3.第*************************行

  表:t

  非唯一:1

  密钥名称:idx_b

  序列索引:1

  列名:b

  排序规则:A

  基数:2

  子部分:100

  打包:空

  空:是

  索引类型:BTREE

  评论:

  索引_注释:

  *************************** 4.第*************************行

  表:t

  非唯一:1

  密钥名称:idx_a_b

  序列索引:1

  列名:a

  排序规则:A

  基数:5

  子部件:空

  打包:空

  空:

  索引类型:BTREE

  评论:

  索引_注释:

  *************************** 5.第*************************行

  表:t

  非唯一:1

  密钥名称:idx_a_b

  序列索引:2

  列名:c

  排序规则:A

  基数:5

  子部件:空

  打包:空

  空:

  索引类型:BTREE

  评论:

  索引_注释:

  一组5行(0.00秒)

  错误:

  未指定查询

  关系型数据库

mysql索引b树和b树的区别,mysql索引为什么用b+树而不是b树