mysql 索引中的USING BTREE 是啥意思??
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql 索引中的USING BTREE 是啥意思??相关的知识,希望对你有一定的参考价值。
b-tree 是mysql 索引默认使用的数据结构,自动建表语句会出现
UNIQUEKEY uq_network_domain USING BTREE (network_id,network_name,network_domain)
手动时不用理会
[CONSTRAINT [symbol]] UNIQUE [INDEX|KEY]
[index_name] [index_type] (index_col_name,...)
[index_option] ...
当然你也可可以写上
index_type:
USING BTREE | HASH
当然你如果不明白什么是B-Tree花还是google 一下吧 参考技术A MYSQL中索引的存储类型有两种:BTREE和HASH,具体和表的存储引擎相关;你说的这个是用BTREE来创建索引,提高查询效率 参考技术B 索引是在存储引擎中实现的,因此每种存储引擎的索引都不一定完全相同,并且每种存储引擎也不一定支持所有索引类型。
根据存储引擎定义每个表的最大索引数和最大索引长度。所有存储引擎支持每个表至少16个索引,总索引长度至少为256字节。
大多数存储引擎有更高的限制。MySQL中索引的存储类型有两种:BTREE和HASH,具体和表的存储引擎相关;
MYISAM和InnoDB存储引擎只支持BTREE索引;MEMORY和HEAP存储引擎可以支持HASH和BTREE索引
B-tree索引是数据库中存取和查找文件(称为记录或键值)的一种方法.B-tree算法减少定位记录时所经历的中间过程,从而加快存取速度.
MySQL索引优化
MySQL官方对索引的定义:索引是帮助MySQL高效获取数据的数据结构。索引是在存储引擎中实现的,所以每种存储引擎中的索引都不一样。如MYISAM和InnoDB存储引擎只支持BTree索引;MEMORY和HEAP储存引擎可以支持HASH和BTREE索引。
这里仅针对常用的InnoDB存储引擎所支持的BTree索引进行介绍:
一、索引类型
先创建一个新表,用于演示索引类型
CREATE TABLE index_table (
id BIGINT NOT NULL auto_increment COMMENT ‘主键‘,
NAME VARCHAR (10) COMMENT ‘姓名‘,
age INT COMMENT ‘年龄‘,
phoneNum CHAR (11) COMMENT ‘手机号‘,
PRIMARY KEY (id)
) ENGINE = INNODB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8;
下图是Col2为索引列,记录与B树结构的对应图,仅供参考:
1、普通索引
这是最基本的索引,没有任何限制。
------直接创建索引
create index index_name on index_table(name);
2、唯一索引
索引列的值必须唯一,可以有空值
---------直接创建唯一索引
create UNIQUE index index_phoneNum on index_table(phoneNum);
3、主键
是一种特殊的唯一索引,必须指定为 PRIMARY KEY,如我们常用的AUTO_INCREMENT自增主键
4、多列索引
也称为组合索引,就是在多个字段上联合建立一个索引
-------直接创建组合索引
create index index_union on index_table(name,age,phoneNum);
这里一个组合索引,相当于在有如下三个索引:
name;
name,age;
name,age,phoneNum;
这里或许有这样一个疑惑:为什么age或者age,phoneNum字段上没有索引。这是由于BTree索引因要遵守最左前缀原则,这个原则在后面详细展开。
二、索引优化
1、选择索引列
创建索引简单,但是在哪些列上创建索引则需要好好思考。可以考虑在where字句中出现列或者join字句中出现的列上建索引
SELECT age----不使用索引 FROM index_union WHERE NAME = ‘xiaoming‘---考虑使用索引 AND phoneNum = ‘18668247687‘;---考虑使用索引
2、最左前缀原则
联合索引(name,age,phoneNum) ,B+树是按照从左到右的顺序来建立搜索树的。如(‘张三‘,18,‘18668247652‘)来检索数据的时候,B+树会优先匹配name来确定搜索方向,name匹配成功再依次匹配age、phoneNum,最后检索到最终的数据。也就是说这种情况下是有三级索引,当name相同,查找age,age也相同时,去比较phoneNum;但是如果拿 (18,‘18668247652‘)来检索时,B+树没有拿到一级索引,根本就无法确定下一步的搜索方向。(‘张三‘,‘18668247652‘)这种场景也是一样,当name匹配成功后,没有age这个二级索引,只能在name相同的情况下,去遍历所有的phoneNum。
B+树的数据结构决定了在使用索引的时候必须遵守最左前缀原则,在创建联合索引的时候,尽量将经常参与查询的字段放在联合索引的最左边。
3、like的使用
一般情况下不建议使用like操作,如果非使用不可的话,需要注意:like ‘%abd%‘不会使用索引,而like ‘aaa%’可以使用索引。这也是前面的最左前缀原则的一个使用场景。
4、不能使用索引说明
mysql会按照联合索引从左往右进行匹配,直到遇到范围查询,如:>,<,between,like等就停止匹配,a = 1 and b =2 and c > 3 and d = 4,如果建立(a,b,c,d)顺序的索引,d是不会使用索引的。但如果联合索引是(a,b,d,c)的话,则a b d c都可以使用到索引,只是最终c是一个范围值。
5、order by
order by排序有两种排序方式:using filesort使用算法在内存中排序以及使用mysql的索引进行排序;我们在部分不情况下希望的是使用索引。
select test_index where id = 3 order by id desc;
如果ID是单列索引,则order by会使用索引
select test_index where id = 3 order by name desc;
如果ID是单列索引,name不是索引或者name也是单列索引,则order by不会使用索引。因为Mysql的一次查询只会从众多索引中选择一个索引,而这次查询中使用的是ID列索引,而不是name列索引。在这种场景下,如果想让order by也使用索引的话,就建立联合索引(id,name),这里需要注意最左前缀原则,不要建立这样的联合索引(name,id)。
最后需要注意mysql对排序记录的大小有限制:max_length_for_sort_data 默认为1024;也就意味着如果需要排序的数据量大于1024,则order by不会使用索引,而是使用using filesort。
以上是关于mysql 索引中的USING BTREE 是啥意思??的主要内容,如果未能解决你的问题,请参考以下文章