MySQL详解:索引的介绍和原理分析

MySQL索引详解:原理、数据结构与分析和优化 理解MySQL索引的原理,特别是B+树索引的工作机制,有助于在实际应用中合理设计和优化索引。索引的选择应基于具体的业务需求和查询模式,避免盲目创建过多索引,以保持数据库的高效性。 阅读详情

索引的定义

MySQL官方对索引的定义为:索引(Index)是协助MySQL高效获取数据的数据结构。

本质上,索引的目的是为了提高查询效率,通过不断地缩小想要获取数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的事件,也就是说,有了这种索引机制,我们可以总是用同一种查找方式来锁定数据。

可以类比银行的保险柜,比如你要找归属你的保险柜子。如果没有索引,你需要拿着钥匙,一个个的保险柜的试过去才能找到属于你的保险柜。但是如果有了索引,而且保险柜能够以物理分区的方式存在在对应的区域,同时你可以根据钥匙上的编号(A1003-10-17),找到保险柜所在 A1003的存放房间,找到存放室保险柜的第10排,再找到第17个位置,找到属于你的保险柜,这个定位就快很多了。在没有索引的情况下,要想完成这个事情还是比较困难的。

索引的原理

除了保险柜之外,生活中可以引出很多类似的索引例子,如字典词典的目录、图书馆的检索录、火车的座次表等。

它们的原理一致:不断地缩小数据范围来筛选数据,并把随机数据变成顺序数据,方便我们更快地锁定数据。

这种索引的理解同样适用我们的数据库查询,但是数据库会有很多更复杂的情况,除了等值查询外,还有范围查询(>、<、between、in)、模糊查询(like)、并集查询(or)、交集查询(and)等等。这就要求数据库选择更加复杂和成熟的方式来应对所有问题。

根据我们上面保险柜的案例,可以对数据按照一定规则进行拆分,这样匹配的范围就降低了,但是这远远不够满足数据库复杂的查询要求。于是,数据库系统的设计者从查询算法的角度进行优化。

其中最基本的查询算法是顺序查找(linear search),这种算法复杂度为O(n),在数据量很大时就很不理想了,而且数据量越大,计算越复杂。

但没关系,强大的计算机科学提供了更多优秀的查找算法,比如二分查找(binary search)、二叉树查找(binary tree search)等。

但是这些查找算法都要求应用于特定的数据结构之上,如二分查找要求被检索数据有序,而二叉树查找只能基于二叉查找树结构上操作, 数据本身的组织结构不可能完全满足各种数据结构,理论上也无法同时要求将多列都按顺序进行组织。

因此, 在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。

这与上面MySQL官方对索引的定义遥相呼应了。

看下面的图:

MySQL详解:索引的介绍和原理分析

 

图举例了一种索引方式。右边是一个数据表,这边一共模拟了两列七行的数据, 字段1 的是数据记录的物理地址(实际应用中逻辑上相邻的记录在磁盘上并不一定物理相邻,这边主要为了举例)。为了加快 字段2 的查找,可以维护一个左边所示的二叉查找树,每个节点分别包含索引键值和一个指向对应数据记录物理地址的指针,这样就可以运用二叉查找在O(log2n)O(log2n)的复杂度内获取到相应数据。

这是索引的一种表现形式,但是实际的数据库系统中比较普遍是采用B+树来实现的。B+树中的B代表平衡(balance),不是二叉(binary)。因为B+树是从最早的平衡二叉树演化而来的,所以我们可以先了解下二叉查找树、平衡二叉树(AVLTree)和平衡多路查找树(B-Tree),因为B+树是由这些树逐步演进而来。

二叉查找树

二叉树具有以下性质:左子树的键值小于根的键值,右子树的键值大于根的键值。 所以左中右是依次递增的一个过程。

如下图所示就是一棵二叉查找树,

MySQL详解:索引的介绍和原理分析

 

观察该二叉树有有如下发现,深度为1的节点的查找次数为1,深度为2的查找次数为2,深度为n的节点的查找次数为n,因此其平均查找次数为 (1+2+2+3+3+3+3) / 7 = 2.4次。

二叉查找树也可以是如下结构(同样满足二叉树 左 < 中 < 大的特性),同样是7,21,35,42,51,77,89 这七个数字,也可以按照下图的方式来构造:

MySQL详解:索引的介绍和原理分析

 

但是这棵二叉树的查询效率就低了,平均查找次数为(1+2+3+4+5+6+6)/7=3.8次。

因此若想二叉树的查询效率尽可能高,需要这棵二叉树是平衡的 ,从而引出新的定义:AVL树(即平衡二叉树)。

平衡二叉树(AVL Tree)

平衡二叉树(AVL树)在符合二叉查找树的条件下, 还满足任何节点的两个子树的高度最大差为1。 下面的两张图片,左边是AVL树,它的任何节点的两个子树的高度差<=1;右边的不是AVL树,其根节点的左子树高度为3,而右子树高度为1,高度差>1;

MySQL详解:索引的介绍和原理分析

 

同理,在平衡二叉树进行插入或删除节点,也可能导致AVL树失去平衡,这种失去平衡的二叉树可以有四种状态:LL(左左)、RR(右右)、LR(左右)、RL(右左)。

看下图示:

MySQL详解:索引的介绍和原理分析

 

我们来逐一看下这几种状态。

LL(LeftLeft),即 左左。 是指插入或删除一个节点后,根节点的左孩子(Left Child)的左孩子(Left Child)还有非空节点,导致根节点的左子树比右子树高度>1,AVL树失去平衡。

RR(RightRight),即 右右。 是指插入或删除一个节点后,根节点的右孩子(Right Child)的右孩子(Right Child)还有非空节点,导致根节点的右子树比左子树高度>1,AVL树失去平衡。

LR(LeftRight),即 左右。 插入或删除一个节点后,根节点的左孩子(Left Child)的右孩子(Right Child)还有非空节点,导致根节点的左子树比右子树高度>1,AVL树失去平衡。

RL(RightLeft),即 右左。 插入或删除一个节点后,根节点的右孩子(Right Child)的左孩子(Left Child)还有非空节点,导致根节点的右子树比左子树高度>1,AVL树失去平衡。

失去平衡的AVL树,可以通过旋转来修复,旋转的本质是将树的节点进行调整,达到恢复平衡的目的。下面逐一来看下。

LL的旋转: LL失去平衡的情况下,可以通过一次旋转让AVL树恢复平衡。步骤如下:

1、将根节点的左孩子作为新根节点。

2、将新根节点的右孩子作为原根节点的左孩子。

3、将原根节点作为新根节点的右孩子。

如下图所示:

MySQL详解:索引的介绍和原理分析

 

RR的旋转: RR失去平衡的情况下,旋转方法与LL旋转相反,步骤如下:

1、将根节点的右孩子作为新根节点。

2、将新根节点的左孩子作为原根节点的右孩子。

3、将原根节点作为新根节点的左孩子。

如下图所示:

MySQL详解:索引的介绍和原理分析

 

LR的旋转: LR失去平衡的情况下,需要进行两次旋转,步骤如下:

1、围绕根节点的左孩子进行RR旋转。

2、围绕根节点进行LL旋转。

如下图所示,它转了两次,最后恢复成一棵AVL树:

MySQL详解:索引的介绍和原理分析

 

RL的旋转: RL失去平衡的情况下也需要进行两次旋转,旋转方法与LR旋转相反,步骤如下:

1、围绕根节点的右孩子进行LL旋转。

2、围绕根节点进行RR旋转。

如下图所示,它转了两次,最后恢复成一棵AVL树:

MySQL详解:索引的介绍和原理分析

 

平衡多路查找树(B-Tree)

我们知道,磁盘这种存储设备是以磁盘块(block)为基本单位的,而B-树也是基于这种存储方式设计的平衡查找树。

所以当我们从系统磁盘读取数据时,以磁盘块(block)为基本单位映射到内存中,位于同一个磁盘块中的数据会被一次性读取出来,而不是只取需要的数据。InnoDB存储引擎中有页(Page)的概念,页是其磁盘管理的最小单位。InnoDB存储引擎中默认每个页的大小为16KB,可通过参数innodb_page_size将页的大小设置为4K、8K、16K,我们可以在命令窗口输入以下脚本查看:

1 mysql> show variables like 'innodb_page_size';
2 +------------------+-------+
3 | Variable_name | Value |
4 +------------------+-------+
5 | innodb_page_size | 16384 |
6 +------------------+-------+
7 1 row in set

而系统一个磁盘块的存储空间往往没有这么大,因此InnoDB每次申请磁盘空间时都会是若干地址连续磁盘块来达到页的大小16KB。

InnoDB在把磁盘数据读入到磁盘时会以页为基本单位,在查询数据时如果一个页中的每条数据都能有助于定位数据记录的位置,

这将会减少磁盘I/O次数,提高查询效率。

B-Tree结构的数据可以让系统高效地找到数据所在的磁盘块。为了描述B-Tree,首先定义一条记录为一个二元组[key, data] ,key为记录的键值,对应表中的主键值,data为一行记录中除主键外的数据。对于不同的记录,key值互不相同。

一棵m阶的B-Tree有如下特性:

1. 每个节点最多有m个孩子。

2. 除了根节点和叶子节点外,其它每个节点至少有Ceil(m/2)个孩子。

3. 若根节点不是叶子节点,则至少有2个孩子

4. 所有叶子节点都在同一层,且不包含其它关键字信息

5. 每个非终端节点包含n个关键字信息(P0,P1,…Pn, k1,…kn)

6. 关键字的个数n满足:ceil(m/2)-1 <= n <= m-1

7. ki(i=1,…n)为关键字,且关键字升序排序。

8. Pi(i=1,…n)为指向子树根节点的指针。P(i-1)指向的子树的所有节点关键字均小于ki,但都大于k(i-1)

B-Tree中的每个节点根据实际情况可以包含大量的关键字信息和分支,如下图所示为一个3阶的B-Tree:

MySQL详解:索引的介绍和原理分析

 

每个节点占用一个盘块的磁盘空间,一个节点上有两个升序排序的关键字和三个指向子树根节点的指针,指针存储的是子节点所在磁盘块的地址。两个键值数据划分成的三个范围域对应三个指针指向的子树的数据的范围域。以根节点为例,两个键值数据为33和66,P1指针指向的子树的数据范围为小于33,P2指针指向的子树的数据范围为33~66之间,P3指针指向的子树的数据范围为大于66。

模拟查找关键字55的过程:

1、根据根节点找到磁盘块Disk1,读入内存。第1次操作磁盘I/O。

2、比较键值55在区间(33,66),找到磁盘块Disk1的指针P2。

3、根据P2指针找到磁盘块Disk3,读入内存。第2次操作磁盘I/O。

4、比较键值55在区间(39,62),找到磁盘块Disk3的指针P2。

5、根据P2指针找到磁盘块Disk8,读入内存。第3次操作磁盘I/O。

6、在Disk8中的键值列表中找到关键字55。

通过上面的操作过程,发现需要3次磁盘I/O操作,和3次内存查找操作。由于内存中的关键字是一个有序表结构, 可以利用二分法查找提高效率。而3次磁盘I/O操作是影响整个B-Tree查找效率的决定因素。

B-Tree相对于AVLTree缩减了节点个数,使每次磁盘I/O取到内存的数据都发挥了作用,从而提高了查询效率。

B+Tree

B+Tree是在B-Tree基础上的一种优化,使其更适合实现外存储索引结构,InnoDB存储引擎就是用B+Tree实现其索引结构。

从上面的B-Tree结构图中可以看到每个节点中不仅包含数据的key值,还有data值。而每一个页的存储空间是有限的,如果data数据较大时将会导致每个节点(即一个页)能存储的key的数量很小,当存储的数据量很大时同样会导致B-Tree的深度较大,增大查询时的磁盘I/O次数,进而影响查询效率。在B+Tree中,所有数据记录节点都是按照键值大小顺序存放在同一层的叶子节点上,而非叶子节点上只存储key值信息,这样可以大大加大每个节点存储的key值数量,降低B+Tree的高度,提高查找效率。

B+Tree相比较于B-Tree的不同点:

1、非叶子节点只存储键值信息。

2、所有叶子节点之间都有一个链指针。

3、数据记录都存放在叶子节点中。

将上面的B-Tree优化,由于B+Tree的非叶子节点只存储键值信息,假设每个磁盘块能存储4个键值及指针信息,则变成B+Tree后其结构如下图所示:

MySQL详解:索引的介绍和原理分析

 

通常在B+Tree上有两个头指针,一个指向根节点,另一个指向关键字最小的叶子节点,而且所有叶子节点(即数据节点)之间是一种链式环结构。因此可以对B+Tree进行两种查找运算:一种是对于主键的范围查找和分页查找,另一种是从根节点开始,进行随机查找。

可能上面例子中只有22条数据记录,看不出B+Tree的优点,下面做一个推算:

InnoDB存储引擎中页的大小为16KB,一般表的主键类型为INT(占用4个字节)或BIGINT(占用8个字节),指针类型也一般为4或8个字节,也就是说一个页(B+Tree中的一个节点)中大概存储16KB/(8B+8B)=1K个键值(因为是估值,为方便计算,这里的K取值为〖10〗^3)。也就是说一个深度为3的B+Tree索引可以维护10^3 * 10^3 * 10^3 = 10亿 条记录。

实际情况中每个节点可能不能填充满,因此在数据库中,B+Tree的高度一般都在2~4层。mysql的InnoDB存储引擎在设计时是将根节点常驻内存的,也就是说查找某一键值的行记录时最多只需要1~3次磁盘I/O操作。

数据库中的B+Tree索引可以分为聚集索引(clustered index)和辅助索引(secondary index)。上面的B+Tree示例图在数据库中的实现即为聚集索引,聚集索引的B+Tree中的叶子节点存放的是整张表的行记录数据。辅助索引与聚集索引的区别在于辅助索引的叶子节点并不包含行记录的全部数据,而是存储相应行数据的聚集索引键,即主键。当通过辅助索引来查询数据时,InnoDB存储引擎会遍历辅助索引找到主键,然后再通过主键在聚集索引中找到完整的行记录数据。

总结

根据上面,二叉查找树,红黑树等数据结构也可以用来实现索引,但是文件系统及数据库系统普遍采用B+Tree作为索引结构( 目前MySQL的MYISAM 和 INNODB 都是采用B+Tree作为索引结构 ),这是因为B+Tree索引的设计是以计算机磁盘存储结构为理论基础的。

索引以索引文件的形式存储在磁盘上,当采用B+Tree查找的时候,产生磁盘I/O消耗对性能的影响比其他方式小很多( 评价一个数据结构作为索引的优劣最重要的指标就是在查找过程中磁盘I/O操作次数的渐进复杂度 )。

换句话说,索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数,而B+Tree无疑是较优的算法。

MySQL 索引详解与原理分析 MySQL 索引是数据库表中用于加速数据检索的数据结构,类似于书本的目录。常见的索引类型包括主键索引、唯一索引、普通索引、组合索引、全文索引和空间索引。MySQL 默认使用 B+Tree 作为索引结构,主键索引是聚簇索引,数据存储在叶子节点上,而辅助索引则存储主键值,需要回表查询。索引的创建、删除和查看可以通过 SQL 语句实现。索引的使用遵循最左前缀原则,覆盖索引可以避免回表,提升查询效率。索引的优点在于加速查询和排序操作,但会占用磁盘空间并影响写入性能。适用场景包括频繁查询的字段、需要唯一性约束的字段等 阅读详情

相关推荐

Deep Reinforcement Learning - 1. DDPG原理和算法

Deep Reinforcement Learning - 1. DDPG原理和算法 背景描述 DDPG的定义和应用场景 DDPG算法相关基本概念定义 DDPG实现框架和算法 DDPG对于DPG的关键改进 下一篇 以下用RL作为Reinforcement Learning 的简称。背景描述概括来说,RL要解决的问

kenneth_yu的博客 14万+

数据库索引和索引底层实现原理

索引的概念和优点 概念: 索引存储在内存中,为服务器存储引擎为了快速找到记录的一种数据结构。索引的主要 作用是加快数据查找速度,提高数据库的性能。 优点: (1) 创建唯一性索引,保证数据库表中每一行数据的唯一性 (2) 大大加快数据的检索速度,这也是创建索引的最主要的原因 (3) 加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。 (4) 在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间 索引的分类 (1) 普通索引:最基本的索引,它没有任何限制。 (2.

PPP12345699的博客 2696

F5 Shape盾JSVMP核心检测点与无限并发Header生成实战(TikTok/航司)

本文深入剖析了F5 Shape盾结合JSVMP技术的核心风控机制,详细解读了其针对浏览器指纹、行为时序等多维度的检测逻辑。通过实战案例,分享了如何通过逆向分析、精准Hook关键检测点,并构建稳定、高并发的请求Header生成方案,以应对TikTok、航司等平台的高级反爬挑战。

weixin_29325007的博客 1014

一文搞懂mysql索引底层逻辑,干货满满!

在mysql中,索引是一种特殊的数据库结构,由数据表中的一列或多列组合而成,可以用来快速查询数据表中有某一特定值的记录。通过索引,查询数据时不用读完记录的所有信息,而只是查询索引列即可,索引是帮助Mysql高效获取数据且以排好序的数据结构,直观的说,索引就类似书的目录页,没有目录(即索引)我们就要一页一页的找,有了目录(索引)我们就可以按照目录中标记的页数去相应的页数去查找。

m0_73088370的博客 1148

H桥电路原理

一、H桥原理 图1中所示为一个典型的直流电机控制电路。电路得名于“H桥式驱动电路”是因为它的形状酷似字母H。4个三极管组成H的4条垂直腿,而电机就是H中的横杠(注意:图1及随后的两个图都只是示意图,而不是完整的电路图,其中三极管的驱动电路没有画出来)。   如图所示,H桥式电机驱动电路包括4个三极管和一个电机。要使电机运转,必须导通对角线上的一对三极管。根据不同三极管对的导通情况,电流可能会从左...

Loadingzc的专栏 7万+

网络摄像头(IPC)介绍:类型、供电、镜头、夜视等

IPC(Internet Protocol Camera,网络摄像头),它是一种由传统摄像机与网络技术结合所产生的新一代摄像机。它可以将视频、音频、报警及控制信号通过网络传输,接受网络监控主机(NVR或监控管理平台)的管理。IPC可与路由器、交换机、NVR等设备组建成为监控系统。

学无止境,Fighting! 1万+

MySQL----索引的底层实现和原理

在前面的文章中,我们分析了索引的分类、创建、删除以及索引的创建原则等,知道了创建索引的目的就是为了加速对表中的数据行的检索而创造的一种分散存储的数据结构。那么索引的底层结构是什么呢?

m0_73537205的博客 1670

数通基础(基本网络通信原理、IP地址如何配置、DHCP、DNS域名系统、路由技术基础、静态路由 、TCP和UDP、vlan虚拟局域网、trunk、三层交换)

我们知道了1、电脑开机,通过dhcp获取ip地址2、电脑输入域名,www.baidu.com电脑把www.baidu.com发到自己的dns服务器3、dns服务器把域名解析成对应的ip地址4、电脑向百度服务器发送一个请求。

qq_53235556的博客 6484

MYSQL索引的底层实现原理

1 索引的本质 索引(Index)是帮助MySQL高效获取数据的数据结构,为什么需要需要特定的数据结构呢?首先,顺序查找这种复杂度为O(n)的算法在数据量很大时显然是糟糕的,更优秀的查找算法,比如二分查找(binary search)、二叉树查找(binary tree search),我们会发现每种查找算法都只能应用于特定的数据结构之上,但是数据本身的组织结构不可能完全满足各种数据结构,所以,在...

孟庆云的博客 5376

Codex 100个真实案例 - 用AI做在线考试系统(自动组卷+防作弊)

本案例使用 Codex 从零搭建一个功能完整的在线考试系统。涵盖题库管理(单选/多选/判断/填空)、智能随机组卷、考试倒计时、自动判分、成绩统计分析、以及多维度防作弊机制(切屏检测、禁止复制粘贴、IP限制等)。前端使用 Vue 3 + Element Plus 构建考试界面,后端使用 Node.js + Express + MySQL 提供 API 服务。全程用自然语言驱动 Codex 完成开发,最终交付一个可直接部署的在线考试平台。

yueyeguzhuo的专栏 83

Python爬虫教程:微博热点话题抓取与社交媒体分析

微博是中国最大的社交媒体平台之一,拥有海量的用户和丰富的讨论话题。通过爬取微博的热门话题和讨论内容,我们可以深入分析用户的兴趣、舆论走势、社会情绪等。通过爬取微博的热点话题和讨论内容,我们可以获得关于当前热门话题的宝贵数据,并基于这些数据进行多种社交媒体分析。本文将通过Python爬虫技术,详细介绍如何抓取微博上的热门话题、话题讨论内容,并进行社交媒体分析。希望本文为你提供了一个全面的微博数据抓取与分析的指南,帮助你在社交媒体数据分析的道路上迈出坚实的第一步。微博上的一些页面内容是静态的,可以直接通过。

2201_76125261的博客 591

【MySQL】索引的底层原理

本期主要讲解: 1、认识索引 2、索引的使用 3、索引底层的数据结构(重点)

程序猿教你打篮球的博客 2212

040、全志V853低功耗AI视觉平台的ISP调优——电池供电场景下的画质与功耗平衡

本文分享了全志V853 AI视觉平台在电池供电场景下的ISP调优经验。作者通过实际项目踩坑案例,揭示了V853 ISP的特殊性:不同于主流平台,其ISP与CPU共享时钟域,降噪能力有限,需特别注意功耗控制。关键优化策略包括:关闭无效ISP模块、优化Sensor联动时钟、采用场景自适应配置、开发快速启动模式等。特别指出V853个体差异大,量产需考虑高低温影响。文章强调V853的ISP功耗优化需从寄存器级别精打细算,不能简单套用其他平台经验,建议选型时单独评估ISP功耗,避免续航缩水。

zzfmlxs的博客 27

mysql的分区和索引详解_MySQL详解:索引的介绍和原理分析

索引的定义MySQL官方对索引的定义为:索引(Index)是协助MySQL高效获取数据的数据结构。本质上,索引的目的是为了提高查询效率,通过不断地缩小想要获取数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的事件,也就是说,有了这种索引机制,我们可以总是用同一种查找方式来锁定数据。可以类比银行的保险柜,比如你要找归属你的保险柜子。如果没有索引,你需要拿着钥匙,一个个的保险柜的试过去才能找...

weixin_35152751的博客 926

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

MySQL索引实现原理分析

目前大部分数据库系统及文件系统都采用B-Tree(B树)或其变种B+Tree(B+树)作为索引结构。B+Tree是数据库系统实现索引的首选数据结构。在MySQL中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的,本文主要讨论MyISAM和InnoDB两个存储引擎的索引实现方式。MyISAM索引实现MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的...

辛勤的搬运工_ 8万+

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

MySQL索引深入解析:从原理到实践

索引是数据库表中一列或多列的值进行排序的一种数据结构,使用索引可以快速访问数据库表中的特定信息。简单来说,索引就像是书籍的目录,能够帮助我们快速定位到需要的内容,而不必逐页翻阅。索引是MySQL性能优化的核心,合理使用索引可以提升查询性能几个数量级。但索引并非越多越好,需要根据实际查询模式、数据分布和写负载来精心设计。理解索引的底层原理有助于做出更好的设计决策,避免常见的性能陷阱。记住,索引设计是一门艺术,需要在查询性能与写开销之间找到平衡点。

weixin_51786043的博客 2832

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

上一篇: 优秀!阿里甩出GC面试小册,仅7天Github获赞96.9K
下一篇: 大白话揭秘搞好就能“年薪百万”的SpringCloud微服务
爱玛士
博客等级 码龄7年 720粉丝 253原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值