MySQL系列:索引(B+Tree树、构建过程、回表、基本操作、执行计划、应用)

MySQL B+树 BTree原理、增删改(详细) 适用场景:内存数据的索引,但不适合磁盘数据的索引,可以认为。而分叉为 410,则百万数据树高约为3,仅。3. 兄第节点没富余,当前结点和兄弟结点及父结点合并成一个新的结点。适用场景:适用于等值查询的场景,内存数据的索引。的行放在同一页中(每页就是树上一个节点),能进一步减少 I/O。),向兄弟结点借一个记录,同时替换父节点,例如删除。兄弟节点合并成一个新的叶子结点,并删除父结点中的。在每个节点上,无论叶子还是非叶子节点,而。,每个叶子节点到根节点距离都相同,兄弟节点也不富余,合并兄弟叶子节点。 阅读详情

介绍

https://dev.mysql.com/doc/refman/5.7/en/optimization-indexes.html

作用

优化查询

算法

索引的算法包括

  • BTree
  • Hash
  • RTree
  • FullText
  • GIS

B+Tree结构

BTree查找算法图

image-20210124235215929.png

B+Tree查找算法图(在叶子节点上加上双向指针)

image-20210124235758493.png

B*Treee查找算法图(在枝节点上也使用双向指针)

image-20210125000005259.png

官方图

image-20210125000313164.png

分类

构建过程

聚簇索引构建过程

作用:

有了聚簇索引,将来插入的数据行,在同一个区内,都会按照ID值得顺序,有序在磁盘存储数据。

MySQL InnoDB 表 通过聚簇索引组织存储数据表。

前提:

  • 1.建表时指定了主键列,MySQL InnoDB会将主键自动作为聚簇索引列,比如Id not null primary key

  • 2.没有指定主键,自动选择唯一键的列作为聚簇索引列

  • 3.以上都没有,生成隐藏聚簇索引

image-20210125003229923.png

辅助索引构建过程

作用:

优化非聚簇索引列

image-20210125214701219.png

回表

介绍

MySQL用来存储数据行的逻辑结构,表的数据行最终存储到了很多个Page上

InnoDB存储引擎,会按照聚簇索引,有序的组织存储表数据到各个区的连续的页中上

这些连续的数据页,成为了聚簇索引的叶子节点,可以认为聚簇所以就是原表数据

所以回表就是回聚簇索引

辅助索引:将辅助索引列值+ID主键值,构建辅助索引BTree结构

用户使用辅助索引作为条件查询时,首先扫描辅助索引的B树

  • 1.如果辅助索引能够完全覆盖到查询结构时,就不需要回表

  • 2.如果不能完全覆盖到,只能通过得到的ID主键值,回到聚簇索引(回表)扫描,最终得到想要的结果

影响

  • 1.IO量级变大

  • 2.IOPS会增大

  • 3.随机IO会增大

减少回表

  • 1.将查询尽可能用ID主键查询

  • 2.设计合理的联合索引

  • 3.更精确的查询条件+联合索引

  • 4.基于优化器对索引的算法(MRR)

基本操作

建议将索引建立在,经常where ,group by ,order by ,join on ...的条件

查询索引

desc test;
key :
PRI 聚簇索引(主键索引) 
MUL 辅助索引 
UNI 唯一索引
(root@localhost) [test]> desc test;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| name  | varchar(20) | NO   | MUL | NULL    |                |
| sex   | varchar(2)  | YES  |     | NULL    |                |
| age   | int(11)     | YES  |     | NULL    |                |
| phone | varchar(11) | YES  | UNI | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

查询索引详细信息

show index from test;
(root@localhost) [test]> show index from test;
+-------+------------+-----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name        | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+-----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| test  |          0 | PRIMARY         |            1 | id          | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
| test  |          0 | ix_unique_phone |            1 | phone       | A         |           0 |     NULL | NULL   | YES  | BTREE      |         |               |
| test  |          1 | ix_name         |            1 | name        | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
| test  |          1 | ix_prifix_phone |            1 | phone       | A         |           0 |        3 | NULL   | YES  | BTREE      |         |               |
| test  |          1 | ix_name_sex     |            1 | name        | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
| test  |          1 | ix_name_sex     |            2 | sex         | A         |           0 |     NULL | NULL   | YES  | BTREE      |         |               |
+-------+------------+-----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
6 rows in set (0.00 sec)

创建索引

创建表时创建索引

create table test(
id int primary key auto_increment , # 主键索引
name varchar(20) not null, 
sex varchar(2) ,
age int ,
phone varchar(11),
unique index ix_unique_phone(phone asc), # 唯一索引
index ix_name(name), # 单列索引
index ix_prefix_phone(phone(3)), # 前缀索引
index ix_name_sex(name,sex) # 联合索引
);

修改表时创建索引

alter table test add primary key(id); # 添加主键索引
alter table test modify id integer auto_increment; # 自增
alter table test add unique ix_unique_phone(phone asc); # 唯一索引 # 
alter table test add index ix_name(name); # 单列索引
alter table test add index ix_prifix_phone(phone(3));  # 前缀索引
alter table test add index ix_name_sex(name,sex); # 联合索引

删除索引

alter table test modify id int; # 取消自增
alter table test drop primary key; # 删除主键索引
# 删除其它索引
alter table test drop index ix_unique_phone;
alter table test drop index ix_name;
alter table test drop index ix_prefix_phone;
alter table test drop index ix_name_sex;

执行计划

查看

explain select * from test;
desc select * from test;
(root@localhost) [test]> insert into test(name,sex,age,phone) values('张三','男',18,'13744551221');
Query OK, 1 row affected (0.00 sec)

(root@localhost) [test]> insert into test(name,sex,age,phone) values('李四','男',18,'13744531221');
Query OK, 1 row affected (0.01 sec)

(root@localhost) [test]> insert into test(name,sex,age,phone) values('王五','女',19,'13744531421');
Query OK, 1 row affected (0.01 sec)

(root@localhost) [test]> explain select * from test where id=1;
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
| id | select_type | table | partitions | type  | possible_keys | key     | key_len | ref   | rows | filtered | Extra |
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
|  1 | SIMPLE      | test  | NULL       | const | PRIMARY       | PRIMARY | 4       | const |    1 |   100.00 | NULL  |
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
1 row in set, 1 warning (0.00 sec)

(root@localhost) [test]> desc  select * from test where id=1;
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
| id | select_type | table | partitions | type  | possible_keys | key     | key_len | ref   | rows | filtered | Extra |
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
|  1 | SIMPLE      | test  | NULL       | const | PRIMARY       | PRIMARY | 4       | const |    1 |   100.00 | NULL  |
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
1 row in set, 1 warning (0.00 sec)

分析

列名说明
id标识符,表示执行顺序
select_type查询类型
1. SIMPLE:简单select,不使用union和子查询
2. PRIMARY:查询中包含任何复杂的子部分,最外层的select被标记为PRIMARY
3. UNION:union中第二个后面的select语句
4. EPENDENT UNION:一般是子查询中的第二个select语句(取决于外查询,mysql内部也有些优化)
5. UNION RESULT:union的结果
6. SUBQUERY:子查询中的第一个select
7. DEPENDENT SUBQUERY:子查询中第一个select,取决于外查询(在mysql中会有些优化,有些dependent会直接优化成simple)
8. DERIVED:派生表的select(from子句的子查询)
table显示数据来自于哪个表,有时不是真实的表的名字(虚拟表),虚拟表最后一位是数字,代表id为多少的查询。
partitions使用的哪个分区,需要结合表分区才可以看到
type类型:全表扫描(all),索引扫描(index,range,ref,eq_ref,const(system))
1. system:表只有一行记录,这个是const的特例,一般不会出现,可以忽略
2. const:表示通过索引一次就找到了,const用于比较primary key或者unique索引。因为只匹配一行数据,所以很快
3. eq_ref:唯一性索引扫描,表中只有一条记录与之匹配。一般是两表关联,关联条件中的字段是主键或唯一索引
4. ref:非唯一行索引扫描,返回匹配某个单独值的所有行
5. range:检索给定范围的行,一般条件查询中出现了>、<、in、between等查询
6. index:遍历索引树。通常比ALL快,因为索引文件通常比数据文件小。all和index都是读全表,但index是从索引中检索的,而all是从硬盘中检索的
7. all:遍历全表以找到匹配的行
possible_keys可能会用到的索引
key实际使用的索引
key_len表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度。一般来说,索引长度越长表示精度越高,效率偏低;长度越短,效率高,但精度就偏低。并不是真正使用索引的长度,是个预估值。
ref表示哪一列被使用了,常数表示这一列等于某个常数
rows大致找到所需记录需要读取的行数
filtered表示选取的行和读取的行的百分比,100表示选取了100%,80表示读取了80%
Extra额外的信息
1. Using filesort:使用外部的索引排序,而不是按照表内的索引顺序进行读取。(一般需要优化)
2. Using temporary:使用了临时表保存中间结果。常见于排序order by和分组查询group by(最好优化)
3. Using index:表示select语句中使用了覆盖索引,直接冲索引中取值,而不需要回行(从磁盘中取数据)
4. Using where:使用了where过滤
5. Using index condition:5.6之后新增的,表示查询的列有非索引的列,先判断索引的条件,以减少磁盘的IO
6. Using join buffer:使用了连接缓存
7. impossible where:where子句的值总是false

应用规范

必须建表一定要有主键,一般是个无关列

选择唯一性索引:唯一性索引的值是唯一的,可以更快速的通过该索引来确定某条记录

限制索引的数目

Percona-toolkit中有个工具:专门分析索引是否有用

尽量少在经常更新值得列建索引

Innodb_index-stats

Innodb_table-stats

Optimize table city;

函数,隐式转换不走索引

<,>,in等也可能不走索引,和结果集有关 超过15%~30%就不走索引

优化器针对索引的算法

思考

更新数据时,会对索引有影响吗?索引是否实时更新?

比如insert,delete,update一行数据

对于聚簇索引会立即更新

对于辅助索引,不是实时更新的

在InnoDB内存结构中,加入了insert buffer(会话),现在版本叫change buffer

change buffer功能是临时缓冲辅助索引需要的数据更新

当我们需要查询新的insert数据,会在内存中进行merge(合并)操作,此时辅助索引就是最新的

image-20210126213605654.png

image-20210126213531124.png

B+Tree索引树高度影响因素?

1.索引字段较长: 前缀索引

2.数据行过多:分区表,归档表(pt-archive),分布式架构

3.数据类型:选择合适的数据类型*

为什么不能乱建索引?

如果冗余索引过多,表的数据变化的时候,很有可能会导致索引频繁更新。会阻塞很多业务更新的请求

索引过多,会导致优化器选择出现偏差

MySQL中的B+树索引(聚簇索引/聚集索引、辅助索引/二级索引、联合索引/复合索引、覆盖索引、回表)详解 聚集索引/聚簇索引--主键 所有的数据辅助索引/二级索引--索引列—+主键。查看其他列–>回表(聚集索引/聚簇索引联合索引/复合索引--(多个列+主键)->覆盖索引(不是索引) 阅读详情

相关推荐

B+Tree优化实战:掌握核心技巧

B+Tree优化实践与SpringBoot集成 本文系统介绍了B+Tree索引的优化策略及与SpringBoot的集成应用。在B+Tree优化方面,重点探讨了合理选择阶数、批量加载、键值压缩等技术手段,同时覆盖了查询性能优化和并发控制机制。SpringBoot集成部分详细展示了通过JPA和MyBatis操作MySQL索引的配置方法,包括实体类定义、查询优化及性能验证技巧。文章还提供了索引维护、批量插入优化等实战示例,并强调了避免过度索引、定期更新统计信息等注意事项。

keny-大成的博客 1331

B+Tree详解

不爱写博客。但是为了流水线,为了乐爷,为了zzq,为...(可变参数)能咋办。写呗

我的博客 1万+

STM32—时钟树(结合系统时钟函数理解)

时钟树的概念: 我们可以把MCU的运行比作人体的运行一样,人最重要的是什么?是心跳! 心脏的周期性收缩将血液泵向身体各处。心脏对于人体好比时钟对于MCU,微控制器(MCU)的运行要靠周期性的时钟脉冲来驱动,而这个脉冲的始源往往是由外部晶体振荡器提供时钟输入,最终转换为多个外部设备的周期性运作。这种时钟“能量”的传递路径犹如大树的养分由主干流向个分支,因此称为时钟树。 STM32时钟: 在STM32...

肥宅快乐博客 1万+

BTree和B+Tree详解

B+树索引是B+树在数据库中的一种实现,是最常见也是数据库中使用最为频繁的一种索引。B+树中的B代表平衡(balance),而不是二叉(binary),因为B+树是从最早的平衡二叉树演化而来的。在讲B+树之前必须先了解二叉查找树、平衡二叉树(AVLTree)和平衡多路查找树(B-Tree),B+树即由这些树逐步优化而来。

我有故人折剑去,斩尽春风不曾归 9382

因果推断--PSM的原理和应用(二)

上一篇介绍了DID,本文介绍和DID可一起搭配使用的一种因果推断方法PSM。在正式介绍PSM之前,先来简单回顾一下为什么需要因果推断以及如何做因果推断。我们都知道相关非因果,比起相关我们更希望知道两个事件之间的因果关系,有了确切的因果关系,才能知道对A如何操作才能引起B的变化。解决因果推断问题,目前主要有两种框架,Rubin虚拟事实模型和Pearl因果图模型。站在数据分析的角度上,Rubin虚拟事实模型更容易理解,其核心思想是寻找恰当的对照组。

baidu_26137595的博客 1万+

Docker网络冲突?手把手教你解决Dify社区版无法访问172.18.0.0网段的问题

本文详细解析了在部署Dify社区版时,因Docker默认网段与局域网冲突导致无法访问172.18.0.0网段的问题。通过剖析Docker网络原理,提供了修改Docker守护进程默认地址池的根治方案,并介绍了在Compose文件中指定自定义网络等备选方法,帮助用户彻底解决网络冲突,保障服务稳定运行。

p8q9r0的博客 486

【Mysql 底层原理】MySQL 索引原理:B-Tree 和 B+Tree 的区别与应用

博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO 专家博主。

激流丶的博客 2839

stata:stata软件教程(人大十八讲)(1) 第一章 stata入门

第一章 stata入门1.1 安装1.2 启用和退出1.3 打开和查看数据1.4 寻求帮助与网络资源1.5 命令示例1.6 几个环境设置1.7 复习与练习1.8 附录 注:教材为:Stata 统计分析教程 stata软件教程(人大十八讲) 中国人民大学出版社 陈传波 1.1 安装 1.2 启用和退出 1.3 打开和查看数据 1.4 寻求帮助与网络资源 1.5 命令示例 1.6 几个环境设置 1.7 复习与练习 1.8 附录 ...

qq_47805483的博客 1万+

MySQL之索引(2)(B树、B+树、索引分类、聚集索引、二级索引、回表查询)

本篇博客的主要内容是关于MySQL的索引中的B树、B+树索引的详细和优缺点、索引分类(主键索引、唯一索引、常规索引)、MySQL中InnoDB存储引擎中索引的存储形式(聚集索引、二级索引)、MySQL中的B+树...

岁岁岁平安的博客 1434

【WSN定位】基于AOA算法实现目标无源定位附matlab代码

1 简介 2 部分代码 clear all; close all; clc;​stations = [0 0 0;20 0 0]; %基站位置​X = -100:100; %生成目标位置Y = X.*sin(X);Z = X+Y;N = length(X);Locations = zeros(N,3);angs = zeros(N,4);for i = 1:N angs(i,:) = Angs(stations*1e3,[X(i),Y(i),Z(i)]*1e3);end​for

qq_59747472的博客 2308

Halcon 形态学 开发案例 (开运算opening(先腐蚀再膨胀)、闭运算closing(先膨胀再腐蚀))

算子方法:功能:使用用户自定义的结构元素对区域进行开运算参数: Region(输入参数) :输入区域 StructElement(输入参数) :结构元素(区域) RegionOpening(输出参数) :开运算后的区域功能:使用圆形结构元素对区域进行开运算参数: Region(输入参数) :输入区域 RegionOpening(输出参数) :开运算后的区域 Radius(输入参数) :圆形结构元素的半径功能:使用矩形结构元素对区域进行开运算。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 1619

【MySQL系列】-回表、覆盖索引真的懂吗

在面试时常会被问一些概念性的东西。这些内容其实在开发中比较少用,但是为了显示你的知识储备你必须学习。博主最近在考Mysql认证时,也常碰到这样的问题。整理MySQL概念输出这篇博文。

记录总结工作过往 1795

数据库系统工程师软考备战:第三篇 - SQL语言深入解析与应用

​​创建表​​​修改表​​​删除表​。

Programming Talk 122

什么是MySQL的回表?

文章目录引言聚簇索引和非聚簇索引是什么?主键索引和非主键索引有什么区别?B-Tree 和 B+Tree 的简单理解如何避免回表? 引言 简单来说,回表就是 MySQL 要先查询到主键索引,然后再用主键索引定位到数据。 下面,对一些问题进行分析与回答: 什么是聚簇索引?什么是非聚簇索引? 为什么回表要先查到主键索引? 主键索引和非主键索引有什么区别? 如何避免回表? 聚簇索引和非聚簇索引是什么? MySQL 的索引有不同的角度的分类方式,例如:按数据结构分、按逻辑角度分、按物理存储分。 其中,按物理存储分

Little_fxc的博客 1万+

图像质量评估和点云质量评估

本文介绍了图像质量评估和点云质量评估的基本概念和常用方法,并提供了相应的源代码示例。图像质量评估关注图像的视觉质量,常用的评估指标包括均方误差(MSE)、结构相似性指标(SSIM)和峰值信噪比(PSNR)。点云质量评估关注点云数据的准确性和完整性,常用的评估方法包括点云配准质量评估、稠密重建质量评估和离群点检测质量评估。在计算机视觉和计算机图形学领域中,图像质量评估和点云质量评估是两个重要的任务。图像质量评估旨在量化图像的视觉质量,而点云质量评估则关注于点云数据的准确性和完整性。

XsupDatabase的博客 992

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

MYSQL-B+TREE索引原理和执行计划的查看

一、B+Tree索引详解 1.什么是索引? 索引:加速查询的数据结构。 2.索引常见数据结构: #1.顺序查找: 最基本的查询算法-复杂度O(n),大数据量此算法效率糟糕。 #2.二叉树查找(binary tree search): O(log2n) 左边是数据表,一共有两列七条记录,最左边的是数据记录的物理地址(注意逻辑上相邻的记录在磁盘上也并不是一定物理相邻的)。为了加快...

熊浪的博客 3759

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

MySQL 索引设计:从执行计划到索引策略的深度优化

MySQL 索引设计的核心是"让查询走索引扫描,避免全表扫描和回表"。联合索引的列顺序遵循"等值→排序→范围"原则,覆盖索引消除回表开销。索引数量控制在 5 个以内,避免写入性能退化。诊断慢查询时,先用 EXPLAIN 确认访问类型和索引使用情况,再根据 WHERE、ORDER BY 和 SELECT 列设计联合索引。建议为每个慢查询建立 EXPLAIN 记录,定期审查索引使用率和冗余索引,保持索引集的精简和高效。删除冗余说明。

iymei4986533030的博客 4871

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

【面试突击】MySQL 索引必会:B+Tree、回表、覆盖索引、最左前缀、索引下推(ICP)

本文深入解析MySQL InnoDB索引的核心机制,重点剖析B+Tree索引结构、聚簇索引与二级索引的区别。详细解释了回表查询的原理及其性能问题,并介绍如何通过覆盖索引避免回表。深入讲解联合索引的最左匹配原则及其实现原理,包括范围查询对索引使用的影响。特别介绍了索引下推(ICP)技术如何优化查询性能。文章还提供了索引设计实战建议,帮助开发者合理设计索引结构,并通过EXPLAIN分析查询执行计划。这些知识对MySQL性能优化和面试准备都具有重要价值。

不堪提 991

主键B+ Tree,二级索引B+ Tree及对应的查询过程分析

若在缓冲池中,称该页在缓冲池中被命中,直接读取该页。简单来说,就是其开辟了一块空间,本来是一条一条回表的,其会将一条一条回表的PK放到一个线程对应的cache里面,放满了做一个操作,根据主键排序,排序之后,再去回表,是不是就是比较顺序了。结果集中的每一行都会以一个满足MySQL客户端/服务器通信协议的封包发送,再通过TCP协议进行传输,在TCP传输的过程中,可能对MySQL的封包进行缓存然后批量传输。mysqlinnodb是索引组织表,索引即数据,数据即索引,索引组织表中数据也是索引的一部分。...

Aiky哇 1623

什么是回表、索引覆盖、索引下推【重点】

参考链接【1】【2】【3】【4】【5】要知道什么是回表、索引覆盖、索引下推,首先大概理解B+树。

qq_45927881的博客 1076

Mysql索引的数据结构、聚簇(集)索引、非聚簇(集)索引、回表查询、覆盖索引、索引的使用原则、B+树,B树对比,索引的创建语法,面试题

在MySQL数据库中,索引是一种特殊的数据结构,它帮助数据库 快速找到存储在表中的数据。就像书的目录一样,索引不是数据本身,而是一个指向数据的快速通道。索引通常使用B+树这种数据结构来实现,它允许数据库以非常高效的方式进行搜索、排序和访问数据。2. 索引的底层数据结构MySQL默认使用的索引 底层数据结构是B+树将数据存储与索引放到了一块,索引结构的叶子节点保存了行数据tip:聚簇索引又叫聚集索引、二级索引又叫(非聚簇(集)索引)将数据与索引分开存储,索引结构的叶子节点关联的是对应的主键。

m0_64422133的博客 1344

【MySQL 数据宝典】【索引原理】- 001 索引原理分析 (AVL树、B-Tree、B+Tree)

B-Tree是一种平衡的多路查找树,B树允许一个节点存放多个数据. 这样可以在尽可能减少树的深度的同时,存放更多的数据(把瘦高的树变的矮胖)B-Tree中所有节点的子树个数的最大值称为B-Tree的阶,用m表示.一颗m阶的B树,如果不为空,就必须满足以下条件.m阶的B-Tree满足以下条件:每个节点最多拥有m-1个关键字(根节点除外),也就是m个子树根节点至少有两个子树(可以没有子树,有就必须是两个)分支节点至少有(m/2)颗子树 (除去根节点和叶子节点其他都是分支节点)

黄金时代的架构之路 952

mysql索引B+ Tree数据结构:主键B+ Tree,复合索引B+ Tree,二级索引B+ Tree及对应的查询过程分析

文章目录B+ Tree数据结构主键B+ Tree复合索引(Compound Index) B+ Tree二级索引B+ Tree查询生命周期回表不回表的情况回表的情况回表优化案例 B+ Tree数据结构 mysql索引就是通过B+ Tree实现的 B+树的primary value(主要作用)是在block-oriented storage context 块存储环境下,in particular, filesystems,比如说文件系统中,来存储数据。 与B树对比,all records都被存储在树的le

u013905744的专栏 1431

【MySQL】回表与覆盖索引

回表与覆盖索引

记录学习的点滴 2336

浅谈MySQL索引以及执行计划

这里若想优化 分两步 ①新建索引(原来的索引需要删除) 顺序为 add index idx(a,c,d,b) ②修改语句:select * from table where a=1 and c=3 and d = 4 and b>2;1.只要我们将来的查询,所有索引列都是<等值>查询条件下,无关排列顺序(跟mysql版本有关,之前版本要按照建索引的顺序查询才能走索引。(2) 在一张表中,聚集索引只能有一个,一般是主键(没有主键则选择唯一键,没有唯一键则会在底层默认生成一个)对于辅助索引来讲,!

qq_47255712的博客 2080

Mysql索引系列-回表

摘要: MySQL回表指使用二级索引查询时,若所需列不在索引中,需通过主键索引再次访问数据,导致两次B+Tree查找。回表会增加随机I/O开销,影响性能。通过EXPLAIN的Using index可判断是否发生回表。优化方法包括使用覆盖索引(将查询列加入二级索引)、减少SELECT *、提高索引选择性等。覆盖索引虽能避免回表,但需权衡维护成本。合理设计索引结构和查询语句可有效降低回表带来的性能损耗。

囚徒之困 689
上一篇: Spring系列:Spring6简介和基本使用
下一篇: Spring系列:基于XML的方式构建IOC
Code技术分享
博客等级 码龄7年 3327粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值