[MySQL]1-MySQL结构与运行原理

MySQL底层运行原理深度解析与性能优化指南 MySQL底层原理与优化要点 MySQL的核心架构包含连接管理、SQL解析优化和存储引擎三个层次。InnoDB作为主流存储引擎,其核心机制包括:B+树索引结构(3层支持千万数据)、事务ACID实现(Undo/Redo Log协同)、行级锁与MVCC并发控制。性能优化关键点在于:合理配置内存参数(缓冲池占内存70%)、避免索引失效(慎用LIKE前缀%)、利用覆盖索引减少回表。特别注意Binlog的ROW格式配置保证主从一致,通过EXPLAIN分析执行计划识别全表扫描。高频问题如MVCC导致的读写可见性差异可通 阅读详情

欢迎来到啾啾的博客🐱。  
>这是一个致力于构建完善的Java程序员知识体系的博客📚,记录学习的点滴,分享工作的思考、实用的技巧,偶尔也分享一些杂谈💬。   
 欢迎评论交流,感谢您的阅读😄。

官网文档


1.逻辑架构🌟

MySQL是分层架构,上下层通过API互通。在SQL被解析优化后,交由存储引擎进行SQL执行。

第一层:处理连接、身份校验等

第二层:SQL解析、优化、内置函数,跨存储引擎的功能实现:存储过程、触发器、视图等。

注:MySQL优化器使用的是基于成本的模型,而衡量成本得主要指标就是一个查询需要扫描多少行。

第三层:存储引擎层,数据的存储与获取。

InnoDB引擎

Mysql默认的引擎为InnoDB引擎。

InnoDB将数据存储在一系列的数据文件中,这些文件被统称为表空间tablespace。

使用MVCC来实现高并发性,默认可重复读REPEATABLE READ隔离级别,通过间隙锁next-key locking策略来防止RR级别的幻读:InnoDB不只锁定在查询中涉及的行,还会对索引结构中的间隙进行锁定,以防止幻行被插入。

数据存在形式以文件形式存在

  • InnoDB

存储的文件两钟 后缀名分别是 .frm 和 .idb

定义文件 和 数据文件

不动数据库引擎使用的编码不一样,数据存储文件和数据定义文件不一样

局部性原理:

一个数据被用到时,附近的数据也会被马上使用

2.数据结构🌟

页结构

3.生命周期

查询大概的生命周期:客户端到服务器、服务器上进行语法解析、生成执行计划、执行、返回结果给客户端

3.1 查询状态🌟

4.查询执行流程

MySQL处理SQL语句的过程是一个复杂且精密的流程,它不仅涉及对SQL语句的基本解析与预处理,还包括查询优化、执行计划生成以及最终的SQL执行阶段。

4.1. 解析与预处理

当一条SQL语句被提交到MySQL时,首先会进入解析器阶段。解析器的主要任务是将SQL语句转换为可以被数据库引擎理解的形式。这一过程包括词法分析、语法分析和语义分析三个主要步骤。

  • 词法分析:此阶段的功能是将输入的SQL字符串分解成一系列有意义的标记(tokens),这些标记构成了SQL语句的基本组成部分。

  • 语法分析:根据SQL语法规则构建抽象语法树(Abstract Syntax Tree, AST)。如果SQL语句不符合MySQL的语法规则,则会在这一阶段抛出错误。

  • 语义分析:检查SQL语句的正确性,例如表名、列名是否存在,确保没有歧义等。此外,还会验证用户是否有权限执行该操作。

接下来是预处理阶段,这里会对解析后的SQL树进行进一步的验证和调整。例如,检查表和列名是否真实存在,解决别名冲突等问题。预处理器还负责处理SQL语句中的参数化查询,允许使用占位符来代替具体的值,从而提高安全性和性能。

4.2. 查询优化器

经过解析与预处理后,SQL语句进入查询优化器阶段。查询优化器的目标是从众多可能的执行方案中选择一个成本最低的方案。为了实现这一目标,优化器需要考虑多个因素,如索引的选择、表之间的连接顺序、数据分布情况等。

  • 索引选择:优化器评估不同索引的有效性,决定是否使用索引以及使用哪种类型的索引。

  • 表连接顺序:在多表查询的情况下,确定以哪个表作为基准表,并定义表之间的连接顺序。

  • 排序策略:如果查询涉及到排序操作,优化器会选择最有效的排序方法。

值得注意的是,MySQL使用基于成本模型的优化器(CBO),这意味着它会尝试估算每种可能执行路径的成本,并选择成本最低的那个。然而,由于计算所有可能组合的成本非常高昂,MySQL通过一些启发式规则限制了搜索空间,比如设置optimizer_prune_level和optimizer_search_depth参数来控制优化器探索的深度和广度。

4.3. 执行计划生成

一旦查询优化器完成了其工作,就会生成一份详细的执行计划。这份计划明确了如何具体执行SQL语句以获取结果,包括但不限于访问路径、连接方法、排序方式等方面的信息。执行计划通常是以一种内部数据结构的形式存在,只有通过特定工具如EXPLAIN命令才能查看其内容。

执行计划的质量直接影响到SQL语句的实际运行效率。因此,定期更新统计信息(如表大小、索引选择性等)对于保持执行计划的准确性非常重要。此外,还可以通过创建合适的索引来改善查询性能,或者利用优化器提示(Hints)指导优化器采用特定的执行策略。

4.4. 执行SQL

最后一步是按照生成的执行计划实际执行SQL语句。在此过程中,MySQL会调用存储引擎层提供的API来完成诸如读取数据、执行表连接、应用过滤条件等一系列操作。具体而言:

  • 读取数据:根据执行计划中的指示,从磁盘或缓存中检索所需的数据行。

  • 表连接:如果是多表查询,则依据执行计划指定的方式执行表间的连接操作。

  • 排序与分组:如果有ORDER BY或GROUP BY子句,则需按要求对结果集进行排序或分组。

  • 过滤数据:运用WHERE子句中的条件表达式筛选符合条件的数据记录。

在整个执行过程中,MySQL可能会遇到各种各样的挑战,比如锁争用、死锁检测、事务管理等。这些问题都需要妥善解决,以确保系统的稳定性和一致性。

综上所述,MySQL处理SQL语句的过程涵盖了从最初的解析到最后的结果返回等多个环节,每个环节都至关重要,共同决定了SQL查询的整体性能表现。

5.数据写入顺序🌟

MySQL 数据写入顺序是一个复杂的过程,涉及到多个日志和缓存机制的协调工作,以确保事务的ACID特性(原子性、一致性、隔离性和持久性)

5.1  写入 Undo Log,实现原子性的关键

在 MySQL 中,当执行一个更新或插入操作时,首先会生成 Undo Log。这是为了支持事务的回滚操作,同时也是实现事务原子性(Atomicity)的关键部分。Undo Log 记录了数据修改前的状态,使得如果事务失败或者被显式回滚,数据库可以利用这些日志将数据恢复到修改之前的状态。

5.2  修改 Buffer Pool,配置innodb_flush_method=O_DIRECT 绕过OS缓存以减少文件系统缓存带来的额外开销

MySQL 将修改的数据页加载到 Buffer Pool 中。Buffer Pool 是 InnoDB 存储引擎用来缓存数据页的一个内存区域。所有对数据的实际修改都会先在这个内存区域中进行,而不是直接写入磁盘。这种设计极大地提高了读写性能,因为内存访问速度远高于磁盘访问速度。值得注意的是,此时的数据页被称为“脏页”(Dirty Page),意味着它们已经被修改但尚未写入磁盘。

通常情况下,MySQL 的写入操作会利用操作系统的页面缓存来提高效率,除非明确设置了 innodb_flush_method=O_DIRECT 参数以绕过 OS 缓存,O_DIRECT通常用于特定高性能需求场景下减少文件系统缓存带来的额外开销。

5.3  写入 Redo Log Buffer 并刷盘,实现持久性以确保数据一致性和完整性

为了保证事务的持久性(Durability),MySQL 还需要将更改记录到 Redo Log 中。Redo Log 是一种物理日志,它记录了对数据库的所有修改信息,MySQL重启后会从Redo Log中恢复数据。每次事务提交时,MySQL 都会将相关的 Redo Log 从 Redo Log Buffer 写入到磁盘上的 Redo Log 文件中。通过这种方式,即使系统发生故障,也可以通过 Redo Log 恢复未完成的事务,确保数据的一致性和完整性。

具体的刷盘策略由参数 innodb_flush_log_at_trx_commit 控制,它可以设置为 0、1 或 2,分别代表不同的安全性和性能权衡。例如,当该值设为 1 时,每次事务提交都会立即将 Redo Log 刷入磁盘,这是最安全但也可能是最慢的选择;而设置为 2 则允许一定的延迟,仅将日志写入 OS 缓存而非立即同步到磁盘上,从而提升性能但稍微降低了数据安全性。

5.4  Binlog 刷盘,用于主从复制、增量备份和数据恢复等

对于开启了二进制日志(Binlog)功能的 MySQL 实例来说,在完成上述步骤之后还需要处理 Binlog 的写入问题。Binlog 是一种逻辑日志,主要用于记录所有的 DDL 和 DML 操作,广泛应用于主从复制、增量备份及数据恢复等领域。与 Redo Log 不同,Binlog 是按事务顺序追加写入的,并且可以通过工具如 mysqlbinlog 查看其内容。

根据 sync_binlog 参数的不同配置,MySQL 可能会在每个事务提交后立刻将 Binlog 同步到磁盘,也可能累积一定数量后再统一执行 fsync 操作。这种灵活性让用户能够在性能与可靠性之间找到平衡点。

5.5  给事务打上 Commit 标签,标明事务结束,Redolog同步。用于重启后数据恢复

最后,在确认所有必要的日志都已经正确写入并持久化之后,MySQL 会给当前事务打上 Commit 标签。这意味着事务正式结束,其结果已经成为数据库状态的一部分。同时,这一状态也会被反映到相应的 Redo Log 中,以便在系统重启后能够准确地恢复已完成的事务记录。

综上所述,MySQL 的数据写入流程不仅包含了 Undo Log、Buffer Pool、Redo Log 和 Binlog 等多个组件之间的交互,还涉及到了多种参数调整的可能性,以满足不同应用场景下的性能与可靠性的需求。在整个过程中,MySQL 始终致力于保障事务的 ACID 特性,从而为用户提供稳定高效的服务体验。

6.MySQL能处理的优化类型

7.MySQL查询优化器的局限性

Oracle支持并行执行查询,原理是将大查询拆分成小查询分治,完成处理后合并最终结果集。

Oracle的并发技术具体来说,对于线程,Oracle有Leader和Worker,可以做到工作分配和协调;对于数据,Oracle将数据划分为多个片段,可以做到分治的前提即数据分片处理。

8.资料引用


B站《猿人林克》MySQL系列
《高性能MySQL》

Windows 环境下 OpenClaw 的安装与千问大模型配置 为了不占用 C 盘空间,重装系统也不丢失配置,本文详细记录了如何将 OpenClaw 安装在非系统盘,比如D 盘,并对接阿里云 通义千问大模型的全过程。主要是利用 NVM 和 npm 进行安装,方便后续一键升级,配置具有免费额度的Qwen API,这个只需要在阿里云百炼注册一个账号就能获得免费额度。 阅读详情

相关推荐

scrapy - 美团民宿 实战练习

目录结构 items.py import scrapy # 民俗名称,地区,价格,房间类型及数量,床的数量,可住几人 class MeituanItem(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() title = scrapy.Field() place = scrapy.Field() price = scrapy.F...

小刘的博客 2662

Mysql 运行原理 (1) - InnoDB 数据存储结构

此系列博客为学习笔记,。某些更加具体细节可能会有遗漏,主要目的在于理解 mysql 整体的运行原理。后面博客如果没有特殊说明,都采用 Mysql 5.7 版本。本文主要介绍,Mysql 中的 InnoDB 存储引擎是如何在磁盘中存储表数据,又通过什么样的存储结构进行存储。

qq_38074398的博客 188

【大模型推理】工作负载的弹性伸缩

推荐采用 并发请求数(Concurrency) 或 队列深度(Queue Size) 结合GPU监控指标(显存/算力利用率),并依托Knative KPA、Fluid缓存、优先级调度等技术实现高效弹性伸缩[citation:6][citation:7][citation:8]。QPS无法体现这种资源消耗累积效应[citation:6]。并发数的本质:是实时反映资源占用的瞬时状态量,而非速率指标,尤其适合单次请求资源消耗大、处理时间长的业务(如LLM推理)[citation:1][citation:6]。

王尚权 qq:2515162716 1182

【MySQL】MySQL体系结构与内部组件工作原理解析(原理篇)(MySQL专栏启动)

​ 《本专栏MySQL》已经更新了15篇,基本的知识以及实际应用的一小部分已经更新完毕,如果对MySQL 有一些疑惑,不要陷入一个管中窥豹、盲人摸象的状态,你应该有自己的“一言以蔽之”和对MySQL 的鸟瞰,这可以帮助你从高维度理解问题。 本文就是带你系统性学习MySQL 数据库的体系结构,详细介绍了MySQL的逻辑结构。

小明的Java问道之路 1万+

rk3588 rkaiq_3A_server 无法解析json文件记录

rk3588 rkaiq_3A_server 无法解析json文件记录

neardi_dev的博客 1万+

Android Studio连接手机详细教程(包含遇到的问题集)

如果以上内容全都调试正确了,还是存在这个无法安装的问题,多半是一开始用的别的手机进行调试安装,然后抽掉线重新换上另一个手机安装调试才会报错。无法识别的 USB 设备,跟这台计算机连接的前一个 USB 设备工作不正常,Windows 无法识别它。此时,我的开发者选项已经开启,并且windows系统和android studio已经能够识别我的设备了,但还是报了这样的错误。右击你的手机——>更新驱动程序——>浏览我的计算机以查找驱动程序软件。右击此电脑——>属性——>设备管理器——>便携设备。

IT小郭的技术博客 4万+

图解 mysql 运行原理

学好 mysql 底层运行原理,才是揭开它神秘面纱的时候

国内某知名游戏公司小菜鸡工程师 4351

complier lab2

只需支持定义 main 函数即可不带参数 int main(){...}带参数 int main(int argc, int argv){...}

qq_43581843的博客 896

了解MySQL(超详细的MySQL工作原理 体系结构)

了解MySQL(超详细的MySQL工作原理 体系结构) MySQL体系结构 MySQL内存结构 MySQL文件结构 innodb体系结构 了解MySQL前你需要知道的 引擎是什么: MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。 当我们理解了引擎这个概念,自然而然就知道引擎层的作用就提供各种不同引擎给

qq_45938466的博客 1万+

图像相似度的评价指标 : FID(Fréchet Inception Distance)

FID(Fréchet Inception Distance) 是用来计算真实图像与生成图像的特征向量间距离的一种度量。如果FID值越小,则相似程度越高。最好情况即是FID=0,两个图像相同。 实际计算: 参考链接:https://machinelearningmastery.com/how-to-implement-the-frechet-inception-distance-fid-from-scratch/ # example of calculating the frechet inceptio

weixin_43723625的博客 1万+

搭建问答系统

数据描述 import docx import jieba from gensim.models import Word2Vec import os import numpy as np import pickle as pk import warnings from copy import deepcopy warnings.filterwarnings("ignore") from mu...

微信号:RunsenLiu 1835

mysql原理(1) mysql底层数据结构

一、前言 1.1 索引结构及查找算法 一个sql语句在mysql里究竟是如何运行的呢?又是怎么去查找的呢? 其中就涉及到数据库(存储数据)以及查找算法。 先来看一下几种查找算法; 目录查找:类似索引 遍历:暴力查找 二分:B+树的基础算法 键查找:hash查找 能做索引的数据结构有:数组、链表、红黑树、B树(B-树、B+树)。 那么哪种数据结构适合做 MySql 数据库的存储结构呢? 先来说下数据的一般存储方式:内存(适合小数据量)、磁盘(大数据量)。 磁盘的运转方式:速度 + 旋转,磁盘页

babyZeng 6211

芒果YOLOv12改进13:独家原创改进最新 CFNet 核心结构|即插即用 | 首发改进显著提升检测性能,小目标检测涨点必备

芒果YOLOv12改进13:独家原创改进最新 CFNet 核心结构|即插即用 | 首发改进显著提升检测性能,小目标检测涨点必备

包括YOLOv5、YOLOv7、YOLOv8等模型改进 279

Mysql运行原理

MySQL 的运行原理涉及多个复杂的组件和过程,包括客户端与服务器的通信、查询处理、事务管理、索引机制、缓存、日志系统以及存储引擎的详细特性。理解这些原理可以帮助你更好地设计数据库、优化性能、处理故障和实现高效的数据管理。

Crazy_shark的博客 1566

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

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

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

MySQL索引背后的数据结构及算法原理

本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题。特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等。为了避免混乱,本文将只关注于BTree索引,因为这是平常使用MySQL时主要打交道的索引,至于哈希索引和全文索引本文暂不讨论。文章主要内容分为三个部分。第一部分主要从数据结构及算法理论层面讨论MySQL数据库索引的数理基础。

攻城狮不是猫 2012

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

MySQL索引的数据结构以及算法原理

写在前面的话        在编程领域有一句人尽皆知的法则“程序 = 数据结构 + 算法”,我个人是不太赞同这句话(因为我觉得程序不仅仅是数据结构加算法),但是在日常的学习和工作中我确认深深感受到数据结构和算法的重要性,很多东西,如果你愿意稍稍往深处挖一点,那么扑面而来的一定是各种数据结构和算法知识。例如几乎每个程序员都要打交道的数据库,如果仅仅是用来存个数据、建建表、建建索引、做做增删改查,那么...

Zeus_龙的博客 2万+

【MySQL运行原理篇】底层运行结构

MySQL底层其实就相当于一个web应用结构。例如:用户前端通过点击按钮发起ajax请求到java后台,后台接收到请求后将用户操作进行业务处理后,通过orm持久层框架(将业务实体与数据表联合)连接mysql,并将封装后的sql语句发送给mysql,mysql接收到sql后进行解析,优化,缓存。接着调用存储引擎的增删改查接口,对磁盘的database进行操作。

You’re a wanderer just like me 918

MySQL体系结构及运行原理

MySQL体系结构 MySQL体系结构图如下: 解释: Client Connectors(接入方) 接入方式有很多,支持协议很多。 Management Serveices & Utilities 系统管理和控制工具,mysqldump、 mysql复制集群、分区管理等。 Connection Pool(连接池) 管理缓冲用户连接、用户名、密码、权限校验、线程处理等需要缓存的需求。 SQL Interface(SQL接口) 接受用户的SQL命令,并且返回用户需

u010347093的专栏 561

MySQL的运行原理一共包含哪些部分?使用场景是什么?底层原理是什么?

想象一下,你去图书馆借书:在 MySQL 中,数据库的运行过程类似,主要包含以下几个部分:

长风破浪会有时的博客 891

【MySQL】MySQL索引背后的数据结构及算法原理

【本文参考地址】

m0_56563273的博客 934

MySQL之体系结构原理

全部文章分为上半场和下半场,上半场内容如下: MySQL 5.7 安装部署(二进制)***** MySQL5.7 体系结构原理 ***** MySQL基础管理 ***** 基础SQL语句使用 ***** SQL高级应用 *** 1.1 连接MySQL的方式 TCP/IP方式(远程/本地) mysql -uroot -p12345 -h 10.10.1.151 -...

漫漫长路 518

MySQL 索引的原理与结构

MySQL索引是提升查询性能的核心机制,主要包括B+树索引、哈希索引和全文索引等类型。B+树索引适用于范围查询和排序,哈希索引仅支持等值查询,全文索引则针对大文本内容搜索。索引通过减少磁盘I/O提高查询效率,但会增加存储空间占用和写入成本。实际应用中,建议在频繁查询、高区分度字段上创建索引,避免在小表或频繁更新字段上使用索引。此外,组合索引需遵循最左前缀原则,全文索引需考虑分词效果。合理选择索引类型和字段是优化数据库性能的关键。

摩霄志在潜修羽,会接鸾凰别苇丛 969

第一部分:MySQL 基础与核心架构(第一节:MySQL 体系结构与运行原理 之 MySQL 内存结构与缓冲机制详解)

MySQL内存结构深度解析:核心缓冲机制与优化策略 MySQL通过精心设计的内存架构实现高效性能,主要包括全局内存、会话级内存和存储引擎内存三大区域。核心组件InnoDB缓冲池采用LRU算法优化,支持多实例和预读机制;日志缓冲系统包含redo/undo日志,确保事务安全;会话级内存区域则处理排序、JOIN等操作。文章详细解析了各缓冲区的配置参数、监控方法和优化策略,包括缓冲池大小计算、预热脚本以及8.0版本的动态调整特性,并提供了性能监控工具和配置建议,帮助DBA实现MySQL内存的高效管理。

weixin_39956506的博客 873

MySQL原理与运行机制

1.MySQL知识普及: MySQL是一个开放源代码的关系数据库管理系统。 MySQL架构可以在多种不同场景中应用并发挥良好作用。主要体现在存储引擎的架构上,插件式的存储引擎架构将查询处理和其它的系统任务以及数据的存储提取相分离。 2.MySQL逻辑架构: 1).最上层: 最上层是一些客户端和连接服务,包含本地的sock通信和大多数基于客...

Aliloke的博客 1459

深入MySQL索引背后的数据结构及算法原理

MySQL索引背后的数据结构及算法原理 在编程领域有一句人尽皆知的法则“程序 = 数据结构 + 算法”,我个人是不太赞同这句话(因为我觉得程序不仅仅是数据结构加算法),但是在日常的学习和工作中我确认深深感受到数据结构和算法的重要性,很多东西,如果你愿意稍稍往深处挖一点,那么扑面而来的一定是各种数据结构和算法知识。例如几乎每个程序员都要打交道的数据库,如果仅仅是用来存个数据、建建表、建建索引、做做增删改查,那么也许觉得数据结构和这东西没什么关系。不过要是哪天心血来潮,想知道的多一点,想研究一下如何优化...

硒氪的博客 580

MySQL索引原理和结构介绍

前言 上篇文章主要介绍了MySQL的索引概念和分类、创建索引的基本语句和命令;还介绍了MySQL的七种JOIN连接查询语句;还介绍了索引的优势和弊端以及适合建立索引、不适合建立索引的场景;还介绍了SQL性能下降的原因,本篇文章主要从MySQL索引的结构和基本原理、EXPLAIN关键字的使用结构。 MySQL索引的结构和基本原理 (一)索引的原理 索引的目的在于提高查询效率,和我们查阅图书目...

木子陈的博客 428

MySQL运行原理与基础架构

1.MySQL基础 MySQL是一个开放源代码的关系数据库管理系统。原开发者为瑞典的MySQL AB公司,最早是在2001年MySQL3.23进入到管理员的视野并在之后获得广泛的应用。2008年MySQL公司被Sun公司收购并发布了首个收购之后的版本MySQL5.1,该版本引入分区、基于行复制以及plugin API。移除了原有的BerkeyDB...

绝圣弃智-零的博客 513
上一篇: [MySQL]MySQL数据类型
下一篇: [MySQL]2-MySQL索引
tataCrayon|啾啾
博客等级 码龄7年 2122粉丝 288原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tataCrayon|啾啾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值