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秒)
错误:
未指定查询
关系型数据库