那些年我们一起优化的SQL

onnxruntime-gpu版本选择与CUDA环境配置实战指南 本文是onnxruntime-gpu版本选择与CUDA环境配置的实战指南。针对AI模型部署中常见的GPU无法调用问题,核心在于确保onnxruntime-gpu版本与系统CUDA Toolkit版本严格匹配。文章详细讲解了如何精准确定CUDA版本、查找官方对应关系、执行正确安装命令,并通过完整测试脚本验证GPU是否成功启用,最后提供了常见问题排查与生产环境调优建议。 阅读详情

一、背景

随着业务不断迭代,系统中出现了较多的SQL慢查。慢查虽不致命,但会让商家感知到系统较慢,影响使用体验。在进行慢查优化过程中,我们积累了一些经验。本文将基于我们的实战经历,讲解工作中比较常见的慢查原因,以及如何去优化。

本文讲解基于MySQL 5.7。

二、慢查优化

本节主要针对常见的慢查进行分类,讲解怎么去优化。

2.1 建立索引的 正确姿势

数据量较大的时候,如果没有索引,那么数据库只能全表一行一行的遍历判断数据,因此优化SQL的时候,第一步要做的就是确定有没有合适的可用的索引。在业务本身比较复杂的情况下,一个表会涉及各种各样的查询方式,因此我们需要建立各种各样的索引去提高查询。然而索引数量过多又会影响增删改的效率,并且也会占用更多额外的空间去存储索引,因此我们要懂得怎么去正确地建立索引,避免索引滥用。

2.1.1 索引不要包含选择性过低字段

选择性过低,即通过该字段只能过滤掉少部分的数据,是没必要建立索引的,因为如果该数据只是占小部分,即使没有索引直接查询数据表也不用过多的遍历即可找到目标数据,没有必要基于索引查询。

SQL:

select * from my_table where col_a=1 and col_b=1

索引:
index (col_a,col_b)

col_b为逻辑删除字段,包含0未删除和1已删除,数据库中的值只有很少量部分是逻辑删除的。但是在业务中我们一般都只查未删除的,那么这种情况col_b是完全不必要在索引中的,可以把col_b从组合索引中去掉。

2.1.2 选择性高的字段前置或者单独建立索引

SQL:

select * from my_table where col_a=1 and col_b=1 and col_c=1

索引:
index(col_a,col_b,col_c)

假设选择性col_c>col_b>col_a,抛开业务本身需要,组合索引建立的顺序尽可能建为index(col_c,col_b,col_a)。

原因是组合索引底层的存储先按照第一个进行排序,第一个字段相同再按照第二字段排序,如果选择性低的字段放在前面,因此选择性高的字段放前面相对而言IO的次数可能会减少一些。比如基于第一个字段过滤完会有10000条数据,基于第二个字段过滤完只有100条数据,如果先查第一个字段则需要在10000条数据的基础上再进行过滤查询,而基于第二字段过滤完只需要基于100条数据进行过滤查询即可。

而如果col_c选择性特别高,经过col_c过滤后只剩下极少的数据甚至一条数据,单独建立col_c索引就可以。

需要注意的是这个规则特别提到了抛开业务本身需要,比如如果col_a选择性比col_b高一点相差不大,但是col_b在业务场景中通用性更强,那么col_b放在前面更合适,可以减少创建的索引。

2.1.3 尽量使用覆盖索引

SQL:

SELECT sum(col_c) FROM my_table where col_a=1 and col_b=1

索引:
index(col_a,col_b)

如果col_a和col_b过滤完后还有大量数据,那么建议建一个 index(col_a,col_b , col_c) 索引,否则MySQL需要通过大量回表去查询col_c的数据再去求和。

2.1.4 小结

1、选择性低的字段不用建立索引。

2、具有唯一性或者高选择性的字段无需与其他字段建立组合索引。

3、除了业务需求上的考虑,尽量将选择性高地索引字段前置。

4、在经过索引过滤后数据量依旧很大的情况下可以考虑通过覆盖索引优化。

2.2 使用索引的正确姿势

除了SQL本身没有适用的索引,有了相关的索引但是对应的索引没有生效是比较常见的情况,以下列举一些常见的失效场景,在日常的开发中,我们要尽量避免。


需要注意的是,索引失效这里指的是没有利用到索引的二分查询进行数据过滤。因为存在ICP,所以会存在触发了失效场景执行计划还是显示使用了索引的情况。

2.2.1 最左匹配截断

SQL:

select * from my_table where col_b=1  

select * from my_table order by col_b

索引:
index(col_a,col_b)

组合索引的匹配规则是从左往右匹配,无论是作为过滤条件还是排序条件都要遵循这个原则。如果要使用col_b字段走索引,查询条件则必须要携带col_a字段。

补充说明:
1、col_b作为排序字段如果要走索引,只要保证组合索引中col_b前面的字段都可以包含在过滤条件或者排序条件中即可,也不需要保证col_b作为组合索引中的最后一个字段。

比如:

select * from my_table order by col_a,col_b

col_a和col_b都可以走索引。

2、如果col_b是作为过滤条件,则col_b前面的字段都应该在过滤条件中。
比如:

select * from my_table where col_b=1 order by col_a

col_a和col_b都走不了索引,因为col_a在组合索引左边,但是col_a不在查询条件中。

2.2.2 隐式转换

字段类型:
col_a(VARCHAR)
col_b(DATETIME)

索引:
index1(col_a)
index2(col_b)

SQL:

select * from my_table where col_a=1  

select * from my_table where col_b=1603296000000

失效原因
字段类型和查询数据的值类型不一致,会导致字段上的索引失效。

  • col_a是字符类型,使用了数字类型进行查询。
  • col_b是datetime类型,针对datetime/date/time类型,MySQL增删查改都要基于字符串形式日期去处理,否则MySQL就需要额外进行转换。(虽然底层储存的是数字类型,但是并不是存储时间戳,底层是处理是统一将外部传入的字符串进行转换,比如是date类型通过将 “2021-12-01” 字符串转数字 20211201 这种形式去存储)。

2.2.3 in + order by 导致排序失 效

索引:
index(col_a,col_b)

SQL:

select * from my_table where col_a in (1,2) order by col_b

解决方式:

  • 如果col_a的过滤性不高,在组合索引中可以通过将col_b字段前置,将col_a移动到组合索引后面,只用于避免或减少回表。
  • 如果col_a的过滤性高,过滤后的数据相对较少,则维持当前的索引即可,剩余不多的数据通过filesort进行排序。
  • 如果存在大量数据,并且经过col_b过滤后还是存在大量数据,建议基于别的数据存储实现,比如Elasticsearch。

另外SQL建议调整为只查询id(或者其他已经在索引中的字段),再根据id去查对应的数据。可以促使SQL走覆盖索引进一步优化、也可以促使MySQL底层在进行filesort使用更优的排序算法。

2.2.4 范围查询阻断组合索引

索引:
index(col_a,col_b)

SQL:

select * from table where col_a >'2021-12-01' and col_b=10

解决方式:
可以调整下索引顺序,col_a放在最后面。index(col_b,col_a)

2.2.5 后缀匹配不能走索引

索引:
index(col_a,col_b)

SQL:

select * from table where col_a=1 and col_b like '%name%'

以上SQL会导致索引失效。前缀匹配比如name%是可以走索引的,但是后缀匹配比如%name会导致没办法基于索引树进行二分查找。如果需要进行后缀匹配,数据量较大建议基于Elasticsearch实现。

2.2.6 or查询导致失效

索引:
index(col_a,col_b)

SQL:

select * from table where col_a=1 or col_b=''

or查询会导致索引失 效,可以将col_a和col_b分别建 立索引,利用Mysql的index merge(索引合并)进行优化。 本质上是分别两个字段分别走各自索引查出对应的数据,再将数据进行合并。

2.2.7 使用函数查询或运算

索引:
index(col_a,col_b)

SQL:

select * from table where col_a=1 and DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(col_b);  

select * from table where col_a=1 and col_b+1=10

2.2.8 不等于、不包含(只用到ICP)

索引:
index(col_a,col_b,col_c)

SQL:

select * from table where col_a=1 and col_b not in (1,2)  

select * from table where col_a=1 and col_b != 1

2.2.9 选择性过低,直接走全表

选择性过低会导致索引失效。由于通过二级索引查询后还有回表查询的开销,如果通过该字段只能过滤少量的数据,整体上还不如直接查询数据表的性能,则MySQL会放弃这个索引,直接使用全表扫描。底层会根据表大小、IO块大小、行数等信息进行评估决定。

索引:

index(col_a)

SQL:

select * from table where col_a>'2017-10-22'

2.2.10 asc和desc混用

索引:
index(col_a,col_b,col_c)

SQL:

select * from my_table where col_a=1 order by col_b desc,col_c asc

desc 和asc混用时会导致索引失效,不建议混用。

2.2.11 小结

根据以上例子,总结几个索引失效的场景:

  1. 组合索引左匹配原则
  2. 发生隐式转换
  3. 组合索引,in + order by in会阻断排序用索引
  4. 范围查询会阻断组合索引,索引涉及到范围查询的索引字段要放在组合索引的最后面。
  5. 前模糊匹配导致索引失效
  6. or查询,查询条件部分有索引,部分无索引,导致索引失效。
  7. 查询条件使用了函数运算、四则运算等。
  8. 使用了!=、not in
  9. 选择性过低
  10. asc和desc混用

2.3 编写SQL的正确姿势

懂得怎么建立索引,也懂得了怎么避免索引失效,但是有些场景即使索引走对了,也会慢查,这时我们要考虑优化我们SQL写法。

2.3.1 深分页

索引:

index(col_c)

SQL:

select * from my_table where col_c=1 limit 1000,10

为什么深分页会效率变差,首先我们要了解一下分页的原理。

MySQL limit不会传递到引擎层,只是在服务层进行数据过滤。查询数据时,先由引擎层通过索引过滤出一批数据(索引过滤),然后服务层进行二次过滤(非索引过滤)。


引擎层过滤后会将获取的数据暂存,服务层一条一条数据获取,获取时引擎层回表获得完成数据交给服务层,服务层判断是否匹配查询条件(非索引过滤),如果匹配会继续判断是否满足limit限制的数据范围,符合并且范围内的数据都查完了才返回。

所以如果深分页,会导致大量的无效回表(前1000条进行了回表,实际上只需要1000-1010的数据),因此优化的方式就是避免深分页带来的额外回表。

解决方式:

# 避免深分页

select * from my_table where id>上次查询的数据id值 limit 100




# 延迟关联 避免大量回表

SELECT * FROM my_table t1,(select id from my_table where col_c=1 limit 1000,100) t2 where t1.id=t2.id



避免深分页: 我们可以改成id过滤,每次都只查询大于上次查询的数据id。这样每次只查询100条,回表也只需要回表100条。

覆盖索引: 如果业务需要的字段比较少,可以通过保证SQL查询的字段和查询条件都在索引上,避免回表。

延迟关联: 通过延迟关联,通过编写完全基于索引查询数据的SQL,再根据id查询详细的字段数据。

2.3.2 order by id

索引:
index(col_a)

SQL:

select * from table where col_a=1 and col_b=2 order by id

MySQL INNODB二级索引最终叶子结点引用的都是主键id,因此我们可以利用这个点去使用id排序。

但是在本场景中,col_b截断了索引,导致SQL没法利用id进行索引排序。而主键索引的权重会比较高,可能会导致MySQL没有正确选择索引,从而选择了可能性能更差的主键索引去做排序,查询条件通过遍历扫描数据。


因此在不能保证id排序可以走索引的情况下,建议改用其他字段排序。如果查询结果集确定会比较少排序字段可以不在索引上,如果结果集较大还是要把排序字段加到索引中。

三、慢查分析

在掌握了SQL优化的理论知识之后,我们怎么验证编写的SQL是否有按照预期使用了比较合适的索引?这就需要学会分析SQL的执行情况。

执行计划:我们可以通过explain关键字查看SQL的执行计划,通过执行计划分析SQL的执行情况。

执行计划字段描述:

extra字段常见值:

using index condition补充说明:
using index condition表示使用了ICP(Index Condition Pushdown索引下推),ICP是MySQL 5.6之后新增的特性,部分字段因为某些情况无法走索引查询,则会展示using where(在server层进行数据过滤),ICP是在存储引擎层进行数据过滤,而不是在服务层过滤,利用索引现有的数据过滤调一部分数据。

using where 和 using index condition的区别:

为什么需要ICP机制:

索引:

index(col_a,col_b)

SQL:

select * from my_table where col_a="value" and col_b like "%value%"

如果没有using index condtion,col_a会走索引查询,匹配到对应的数据后,回表查出剩余字段信息,再去匹配col_b。假设col_a过滤后还有10000条数据,而通过col_b过滤后只会剩余1000条数据,则有9000条的数据是没必要的回表。

本质上索引树上是包含col_b字段的,只是col_b不能利用索引树二分查找特性(因为使用了前模糊匹配),但是可以利用索引上现有的数据进行遍历,减少无效回表。有了ICP后,基于索引就可以过滤col_a和col_b字段,过滤后只会剩下1000条数据,减少了大量的回表操作。

小结:
通过执行计划我们可以分析出SQL最终使用了什么索引,对索引的使用是处于什么情况,进而可以得出还有没有优化空间。

四、总结

我们要有质量意识,做好预防而不是做补救,SQL优化在开发阶段就要考虑清楚,而不是等上线后出现慢查了才去优化。


做好SQL优化可以记住一个口诀,有用高。SQL要有索引(建立正确的索引),索引要可用(避免索引失效),最后要考虑高效(覆盖索引、索引的选择性)。

遥感影像分割实战:LoveDA数据集从下载到训练全流程指南(附避坑技巧) 本文以LoveDA数据集为例,提供了一份详尽的遥感影像语义分割实战指南。内容涵盖从数据下载、理解与预处理,到环境配置、模型选择与训练,再到性能调优与部署的全流程,并重点分享了多个关键环节的避坑技巧,旨在帮助开发者和研究者高效上手并解决实际问题。 阅读详情

相关推荐

scannet数据集下载文件

scannet数据集下载文件 由于大家会申请scannet数据集,审批比较慢,我将下载的文件里面的内容贴出来,大家可以复制放进py文件中,运行就可以下载 ps:别再私信要数据集了,这个自己下载,如果光三维数据的话,还是很快的,当然如果路由器翻了墙的话,下载会更快。 #!/usr/bin/env python # Downloads ScanNet public data release # Run with ./download-scannet.py (or python download-scannet.

weixin_40766438的博客 9233

Mysql添加索引的原则

因此,在添加索引之前,最好进行性能测试和评估,以确保索引的有效性和可持续性。因此,在进行写入操作频繁的表上,需要慎重考虑添加索引的影响。多列索引原则:对于经常以多个字段为条件进行查询的情况,可以创建多列索引,以加速这样的查询操作。选择性低的字段(例如性别字段),添加索引的效果可能不明显。频繁查询字段原则:对于经常被用于查询的字段,可以添加索引,以加速相关的查询操作。索引长度原则:索引的长度影响其占用的存储空间和查询的效率。通常情况下,索引长度应该越短越好,但也要确保能够满足索引的唯一性和查询条件的要求。

雁回的博客 702

星空组网 vs 蒲公英 vs Tailscale:2024年国内免费异地组网工具横评(含实测数据)

本文对2024年国内主流免费异地组网工具星空组网、蒲公英和Tailscale进行了深度横向评测。基于实测数据,重点分析了三者在P2P成功率、中继延迟、传输速度及稳定性方面的表现,为中小企业、远程办公及个人开发者提供了清晰的选择指南。星空组网在国内网络环境下展现出优秀的平衡性。

weixin_29217235的博客 1439

为什么我说,数据库优化并不是DBA一个人的事?

点击蓝色“有关SQL”关注我哟加个“星标”,天天与10000人一起快乐成长图 | L当信息管理系统还是 C/S,B/S 模式的年代,数据库优化交给DBA一个人做,还没有太大的压力。有些D...

wujiandao的专栏 438

Oracle EBS R12.2 安装 -- Step by Step

Oracle EBS R12.2 安装 -- Step by Step

Albert Tan DBA之路 1512

YOLO26涨点改进 | 全网独家创新,注意力改进篇 | TGRS 2025 | 引入APCM自适应像素级协同机制,动态增强目标区域、抑制背景噪声,助力YOLO26做红外小目标检测有效涨点

本文提出一种基于APCM模块改进的YOLO26网络模型,通过像素级局部-全局协同建模动态增强目标特征并抑制背景噪声。APCM模块采用轻量化设计,无需复杂参数,在特征提取阶段有效提升目标区域特征表达质量,尤其适用于低对比度和复杂场景下的目标检测。实验表明,该方法能显著提高小目标检测精度和模型鲁棒性,同时保持较低计算开销。模块通过局部特征分支和全局特征分支的协同融合,实现了对红外小目标的有效增强,在NUAA-SIRST和IRSTD-1K数据集上性能优于现有方法。文章还提供了完整的代码实现和配置指南。

Ai缝合怪、助力小伙伴高效发论文 190

如何针对慢查询的sql进行优化?

在优化 SQL 时,可以使用 EXPLAIN 命令来查看查询计划,找到 SQL 查询性能瓶颈,进而进行针对性优化。优化 JOIN 操作:在使用 JOIN 操作时,确保连接条件是正确的,并尽可能使用 INNER JOIN 而不是 OUTER JOIN,因为 INNER JOIN 的性能通常更好。减少返回数据量:尽可能只返回需要的数据,可以通过使用 SELECT 子句来指定需要的列,并使用 LIMIT 限制返回的行数。使用索引:确保表中的列都有适当的索引,尤其是在查询中频繁使用的列。

ggjklncffd的博客 4921

Unity最强动作战斗框架?Combat System Framework 深度解析

Combat System Framework 并不是一个简单的角色控制器,而是一套完整的动作游戏战斗开发框架。它借鉴了现代 AAA 游戏常见的架构思想,以 Gameplay Tag 为核心,结合 ScriptableObject 数据驱动设计,将技能、属性、Buff、伤害、武器、动画通知等系统有机整合在一起。同时,配套的可视化动画时间轴、Root Motion 工具和实时预览窗口,大幅优化了动作开发流程。当然,这套框架也有一定的学习门槛。

2403_88403568的博客 681

SQL 优化极简法则,还有谁不会?

点击上方 "程序员小乐"关注,星标或置顶一起成长 后台回复“大礼包”有惊喜礼包! 关注订阅号「程序员小乐」,收看更多精彩内容 每日英文 When you are free from desire, you will be happy, because you will never be disappointed. 当你没有欲望,你就会快乐,因为你永不会失望。 每日掏心话 懂得进退,才能成就人生;懂得取舍,才能淡定从容;懂得知足,才能怡养心性;懂得删减,才能轻松释然;懂得变通,才会..

吧主 436

【目标检测】基于yolov5的道路坑洼检测(附代码和数据集)

基于yolov5的道路坑洼检测(附代码和数据集)

学无止境、积少成多、厚积薄发 4620

实时系统vxWorks - 虚拟机环境搭建

概述VxWorks 操作系统是美国WindRiver公司于1983年设计开发的一种嵌入式实时操作系统(RTOS),是嵌入式开发环境的关键组成部分。良好的持续发展能力、高性能的内核以及友好的...

不只会拍照的程序猿 7853

智能 SQL 优化工具 PawSQL 月度更新 | 2025年3月

本月更新包含 21项功能增强 和 9项问题修复,重点提升SQL解析精度与优化建议覆盖率。

PawSQL的博客 662

SO_KEEPALIVE、TCP_KEEPIDLE、TCP_KEEPINTVL、保活包

是一个套接字选项,用于设置是否启用 keepalive 机制。在这段代码中没有涉及到选项的设置。当被设置为非零值时,表示启用 keepalive 机制。keepalive 是一种用于检测连接是否仍然有效的机制。通过定期发送一些特定的探测数据,可以检测到网络连接的异常中断或对端应用程序的崩溃退出。为了避免以上情况,可以启用 keepalive 机制,即使在无数据传输的情况下也定期发送探测数据。如果在一定时间内没有收到对端的响应,就认为连接已经失效,并进行相应的处理。要启用选项,需要使用函数。其中,fd。

m0_46376834的博客 4816

[SQL]2024年不可错过的10个高效查询优化技巧

但需要注意的是,索引并非越多越好,因为维护索引需要额外的存储空间和写操作开销。通过分析执行计划,你可以了解查询是如何被执行的:是否使用了索引、表的连接顺序、连接类型(如Nested Loop, Hash Join, Merge Join)以及预估的行数等。明确指定所需的列名,可以显著减少不必要的数据传输和处理,提升查询响应速度,并使查询意图更加清晰。这不仅能减少网络传输的数据量,更重要的是,数据库可能在获取到指定行数后立即停止扫描,尤其在配合ORDER BY使用且有合适索引时,效率提升非常显著。

a1084941734的博客 725

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

那些年我们经常唠嗑的sql优化

我们出去面试经常会被问到数据库这一块,而涉及数据库这一块问的最多的就是数据库优化。那么我们怎么做才能做好优化问题呢?今天我们就来聊聊数据库优化那些事。数据库优化我们一般可以从以下几个方面考虑:数据库表设计sql语句优化。

m0_69305074的博客 145

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

那些年我们经常唠嗑的SQL优化

我们出去面试经常会被问到数据库这一块,而涉及数据库这一块问的最多的就是数据库优化。那么我们怎么做才能做好优化问题呢?今天我们就来聊聊数据库优化那些事。数据库表设计sql语句优化数据库大型项目拆分为小项目,每个项目有自己独立的数据库原来所有数据表都放在一个数据库节点上,所有的读写请求也都发到这个MySQL上面,所以数据库的负载太高。如果把一个节点的数据库拆分成多个MySQL数据库,这样就可以有效的降低每个MySQL数据库的负载。分表分库(取模分表、水平分表、垂直分表)

lxmtim的博客 197

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

2025年全网最牛最全面的sql优化常用的方法

要查询的数据就不能只在索引树里找了,得需要回表操作才能完成查询的工作,再加上是左模糊匹配,无法利用索引树的有序性来快速定位数据,所以得在索引树逐一遍历,获取主键值后,再到聚簇索引树检索到对应的数据行,这样实在太累了。union和union all的差异主要是前者需要将结果集合并后再进行唯一性过滤操作,这就会涉及到排序,增加大量的CPU运算,加大资源消耗及延迟。SQL语句中IN包含的值不应过多,MySQL对于IN做了相应的优化,即将IN中的常量全部存储在一个数组里面,而且这个数组是排好序的。

weixin_67553250的博客 1603

智能SQL优化工具 PawSQL 月度更新 | 2025年10月

在过去的十月,PawSQL团队持续深耕SQL优化领域,推出了一系列功能更新和问题修复,显著提升了产品的稳定性、性能和使用体验。本文将为您详细解析这些技术改进。

PawSQL的博客 714

2022年 SQL 优化大全总结详解

SQL优化总结

ytp552200ytp的博客 516

慢 SQL 分析与优化,2024年最新深入剖析原理

小结:对于该 case, 索引效果[org_code,trade_date_time] > [trade_date_time, org_code]>[trade_date_time]。实际业务场景中,检索条件中 trade_date_time 基本上肯定会出现,但 org_code 却不一定,故索引的设计还需要结合实际业务需求。MySQL使不使用索引与所查列无关,只与索引本身,where条件,order by 字段,group by 字段有关。优化后:执行总行数为:6 行,耗时 34ms。

2401_84300038的博客 654
上一篇: Redis Pipeline原来是这么用的
下一篇: 首次发布,2022年阿里巴巴Java高级架构师面试标准手册(对标P7+)
Javaesandyou
博客等级 码龄5年 742粉丝 563原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值