B-Tree 索引

不同的存储引擎也可能使用不同的存储结构,i如,NDB集群存储引擎内部实现使用了T-Tree结构存储这种索引,即使其名字是BTREE;InnoDB使用的是B+Tree。

B-Tree通常一位这所有的值都是按顺序存储的,并且每一个叶子页道根的距离相同。下图大致反应了InnoDB索引是如何工作的。

为什么mysql索引要使用B+树,而不是B树,红黑树

看完上面的文章就可以理解为何B-Tree索引能够快速访问数据了。因为存储引擎不再需要进行全表扫描获取需要的数据,叶子节点包含了所有元素信息,每一个叶子节点指针都指向下一个节点,所以很适合查找范围数据。

索引对多个值进行排列的依据是CREATE TABLE 语句中定义索引时的顺序。

那么,索引排序的规则就是按照 last_name ,first_name ,dob 的顺序来的。

可以使用 B-Tree 索引的查询类型

B-Tree索引适用于全键值、键值范围或键前缀查找。

键前缀查找只是用于根据最左前缀查找。

举个粒子:

CREATE TABLE People (

last_name VARCHAR ( 50 ) NOT NULL,

first_name VARCHAR ( 50 ) NOT NULL,

dob date NOT NULL,

gender enum ( 'm', 'f' ) NOT NULL,

KEY ( last_name, first_name, dob )

);

这个表的索引如下:

type结果

type结果值从好到坏依次是:

system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

一般来说,得保证查询至少达到range级别,最好能达到ref,否则就可能会出现性能问题。

possible_keys:sql所用到的索引

key:显示MySQL实际决定使用的键(索引)。如果没有选择索引,键是NULL

(1)全值匹配

全值匹配指的是和索引中的所有列进行匹配。

例如上面的People表的索引(last_name,first_name,dob)可以用于查找last_name='Cuba Allen',first_name='Chuang',dob='1996-01-01'的人。这就是使用了索引中的所有列进行匹配,即全值匹配。

mysql> EXPLAIN select * from People where last_name = 'aaa' and first_name = 'bbb' and dob='2020-11-20' \G;

*************************** 1. row ***************************

id: 1

select_type: SIMPLE

table: People

partitions: NULL

type: ref

possible_keys: last_name

key: last_name

key_len: 307

ref: const,const,const

rows: 1

filtered: 100.00

Extra: NULL

1 row in set, 1 warning (0.00 sec)

ERROR:

No query specified

(2)匹配最左前缀

可以只使用索引的第一个列进行匹配。

例如可以用于查找last_name='aaa'的人,即用于查找姓为Zeng的人,这里只使用了索引的最左列进行匹配,即匹配最左前缀。

mysql> EXPLAIN select * from People where last_name = 'aaa' \G;

*************************** 1. row ***************************

id: 1

select_type: SIMPLE

table: People

partitions: NULL

type: ref

possible_keys: last_name

key: last_name

key_len: 152

ref: const

rows: 3

filtered: 100.00

Extra: NULL

1 row in set, 1 warning (0.00 sec)

ERROR:

No query specified

(3)匹配列前缀

可以只匹配某一列的值的开头部分。

例如可以用于查找last_name LIKE ‘a%'的人,即用于查找所有以Z开头的姓的人,这里只使用了索引最左列的前缀进行匹配,即匹配列前缀。

mysql> EXPLAIN select * from People where last_name = 'a%' \G;

*************************** 1. row ***************************

id: 1

select_type: SIMPLE

table: People

partitions: NULL

type: ref

possible_keys: last_name

key: last_name

key_len: 152

ref: const

rows: 1

filtered: 100.00

Extra: NULL

1 row in set, 1 warning (0.00 sec)

ERROR:

No query specified

(4)匹配范围值

可以只适用索引的第一列查找符合某个范围内的数据。

例如可以用于查找last_name BETWEEN ‘aaa' AND ‘aaabbbccc'的人,即用于查找姓在aaa和aaabbbccc之间的人,这里只使用了索引最左列的前缀进行范围匹配,即匹配范围值。

mysql> EXPLAIN select * from People where last_name BETWEEN 'aaa' and 'aaabbbccc'\G;

*************************** 1. row ***************************

id: 1

select_type: SIMPLE

table: People

partitions: NULL

type: range

possible_keys: last_name

key: last_name

key_len: 152

ref: NULL

rows: 3

filtered: 100.00

Extra: Using index condition

1 row in set, 1 warning (0.00 sec)

ERROR:

No query specified

(5)精确匹配某一列并范围匹配另外一列

可以使第一列全匹配,第二列范围匹配。

例如可以用于查找last_name='aaa' AND first_name LIKE 'b%'的人,即用于查找姓是Zeng,名字以C开头的人,这里使用了索引的最左列精确匹配,第二列进行范围匹配。

mysql> EXPLAIN select * from People where last_name = 'aaa' and first_name like 'b%'\G;

*************************** 1. row ***************************

id: 1

select_type: SIMPLE

table: People

partitions: NULL

type: range

possible_keys: last_name

key: last_name

key_len: 304

ref: NULL

rows: 1

filtered: 100.00

Extra: Using index condition

1 row in set, 1 warning (0.00 sec)

ERROR:

No query specified

(6)只访问索引的查询

查询只需访问索引,而无须访问数据行。

例如select last_name, first_name where last_name='aaa'; 这里只查询索引所包含的last_name和first_name列,则无须读取数据行。

mysql> explain select last_name,first_name,dob from People where last_name = 'aaa'

*************************** 1. row ***************************

id: 1

select_type: SIMPLE

table: People

partitions: NULL

type: ref

possible_keys: last_name

key: last_name

key_len: 152

ref: const

rows: 1

filtered: 100.00

Extra: Using index

1 row in set, 1 warning (0.00 sec)

ERROR:

No query specified

B-Tree 的限制

(1)只能按照索引的最左列开始查找。

例如People表中的索引无法用于查找first_name为'bbb'的人,也无法查找某个特定生日的人,因为这两个列都不是最左数据列。

(2)只能按照索引最左列的最左前缀进行匹配。

例如People表中的索引无法查找last_name LIKE ‘%b'的人,虽然last_name就是此索引的最左列,但MySQL索引无法查找以‘b'结尾的last_name的记录。

(3)只能按照索引定义的顺序从左到右进行匹配,不能跳过索引中的列。

例如People表中的索引无法用于查找last_name='a' AND bod='1996-01-01'的人,因为MySQL无法跳过索引中的某一列而使用索引中最左列和排在末尾的列进行组合。如果不指定索引中中间的列,则MySQL只能使用索引的最左列,即第一列。

(4)如果查询中有某个列的范围查询,则其右边所有列都无法使用索引优化查找。

例如有这样一个查询:where last_name='a' AND first_name LIKE 'b%' AND dob='1996-01-01'; 这个查询只能使用索引的前两列,因为这里LIKE是一个范围条件,则first_name后面的索引列都将失效。(优化点:尽量不要在索引列中使用LIKE等范围条件,改用多个等于条件来替代,保证后面的索引列能生效。)

以上就是浅析MysQL B-Tree 索引的详细内容,更多关于MysQL B-Tree 索引的资料请关注我们其它相关文章!

本文标题: 浅析MysQL B-Tree 索引

本文地址: http://www.cppcns.com/shujuku/mysql/365953.html

using b tree mysql_浅析MysQL B-Tree 索引相关推荐

  1. mysql的递归查询_比较两种mysql递归tree查询效率-mysql递归tree

    --初始数据 INSERT INTO `t_areainfo` VALUES ('1', '0', '中国', '0', '0'); INSERT INTO `t_areainfo` VALUES ( ...

  2. B+/-Tree原理及mysql的索引分析

    B+/-Tree原理 B-Tree介绍 B-Tree是一种多路搜索树(并不是二叉的):        1.定义任意非叶子结点最多只有M个儿子:且M>2:        2.根结点的儿子数为[2, ...

  3. mysql b tree索引原理_MySQL中B+Tree索引原理

    B+树索引是B+树在数据库中的一种实现,是最常见也是数据库中使用最为频繁的一种索引.B+树中的B代表平衡(balance),而不是二叉(binary),因为B+树是从最早的平衡二叉树演化而来的.在讲B ...

  4. mysql b tree索引原理_B+Tree原理及mysql的索引分析

    一.索引的本质 MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构.提取句子主干,就可以得到索引的本质:索引是数据结构. 我们知道,数据库查询是数据库的最主要功能之 ...

  5. mysql b tree_Mysql索引机制(B+Tree)

    1,索引谁实现的: 索引是搜索引擎去实现的,在建立表的时候都会指定,搜索引擎是一种插拔式的,根据自己的选择去决定使用哪一个. 2,索引的定义: 索引是为了加速对表中数据行的检索而创建的一种分散存储的( ...

  6. 数据库优化/Linux安装Mysql/B+Tree详解

    一.Linux安装MySQL yum安装 #下载安装源 wget http://repo.mysql.com/mysql57-community-release-el6-8.noarch.rpm #安 ...

  7. 的列数 获取mysql_阿里面试:MySQL如何设计索引更高效?

    有情怀,有干货,微信搜索[三太子敖丙]关注这个不一样的程序员. 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试完整考点.资料以及我的系列文章. ...

  8. 移动 网络 连mysql_中国移动MySQL数据库优化最佳实践

    本文根据DBAplus社群第69期线上分享整理而成,文末还有书送哦~ 讲师介绍章颖 数据研发工程师 现任中国移动杭州研发中心数据研发工程师,擅长MySQL故障诊断,性能调优,MySQL高可用技术,曾任 ...

  9. 架构周报| 浅析MySQL JDBC连接配置上的两个误区

    经典案例 \\ 浅析MySQL JDBC连接配置上的两个误区:相信使用MySQL的同学都配置过它的JDBC驱动,多数人会直接从哪里贴一段URL过来,然后稍作修改就上去了,对应的连接池配置也是一样的,很 ...

最新文章

  1. 网络游戏性能测试的几点想法
  2. GitHub 为什么有些时候进去特变慢
  3. 启明云端直播来了!真的来了!15号晚7:30分启明云端带着8ms菇凉正式亮相立创直播,带你一起畅玩彩屏!参与直播互动的小伙伴将会得到红包大奖及获得SigmarstarSSD201开发板\核心板的机会
  4. java统计一个字符串中每个字符出现的次数_剑指offer算法题054:字符流中第一个不重复的字符...
  5. Serverless在游戏运营行业进行数据采集分析的最佳实践
  6. MATLAB中如何让分度值小点,实验6 干涉的matlab模拟.doc
  7. php克隆 自动加载
  8. 爬取嘉兴市人才网即时招聘信息并写入文本TXT完整案例
  9. python之 turtle好例子集锦
  10. DCDC电源模块方案 大功率DCDC变换器
  11. mp c2011sp文件服务器,理光Ricoh MP C2011SP驱动
  12. linux 查看日志以及查看
  13. 在VMware16中安装 Win10操作系统
  14. 微型计算机的最少配是,只有SD卡大小的微型电脑 配Atom处理器
  15. G1垃圾回收器-----基本知识及原理解析
  16. 安装 win7虚拟机
  17. txt文本去重复 亲测50G文本高效去重复
  18. intellij idea快速切换大小写
  19. 关于财务业务模型的思考
  20. 偏微分方程的特征线法

热门文章

  1. 土地估价师继续教育培训心得体会
  2. 《从零开始的 RPG 游戏制作教程》第十期:信息反馈(下)
  3. 中国石油大学(北京)本科毕业论文答辩和论文选题PPT模板
  4. mysql 云端连接_云服务器远程连接mysql数据库
  5. matlab 符号 积分法,MATLAB积分方法
  6. 字节跳动 录屏功能_免费屏幕录制软件有哪些?原来这么多
  7. JGG近期专刊征稿汇总|时空组学、人体微生物组、人类遗传病、小麦生物学
  8. 通过WIFI唤醒终端设备
  9. Go 小项目1 - 家庭收支记账软件
  10. 低代码里程碑版—JeecgBoot 3.4.3 版本发布,低代码功能专项升级