新闻详情

新闻详情

首页 / 资讯中心 / 详情

MySQL慢查询优化实战:pt-query-digest安装与报告解读

发布时间:2026/9/28 6:32:29来源:尧图网络
MySQL慢查询优化实战:pt-query-digest安装与报告解读
作为一个在数据库运维一线摸爬滚打了十多年的人我几乎每天都会面对同事的灵魂拷问我的SQL为什么突然变慢了 其实绝大多数情况下慢的不是数据库本身而是我们根本没看清SQL在数据库里到底是怎么跑的。MySQL虽然自带了慢查询日志但日志文件一旦膨胀到几个GB靠肉眼去翻、去猜效率极低。所以我一直建议团队里的每个人——无论是开发还是DBA——都必须掌握pt-query-digest这个工具把日志变成一眼就能看清主次的报告让数据替我们说话。这篇文章我会从一个实践者的角度完整梳理pt-query-digest的安装、原理、报告解读以及如何基于报告落地慢查询优化。无论你是刚接触MySQL性能调优的新手还是在生产环境处理过多次故障的运维老手这篇文章里的经验和方法应该都能给你一些启发。1. pt-query-digest是什么为什么慢查询优化首选它pt-query-digest是Percona Toolkit工具集里最核心的成员之一。Percona Toolkit是一组面向MySQL和系统性能调优的命令行工具而pt-query-digest的专职工作就是解析MySQL的慢查询日志、binlog、通用日志以及SHOW PROCESSLIST的输出把它们聚合成可读性极高的统计分析报告。我第一次接触这个工具是接手一套遗留业务系统的时候。那套系统几百张表每天慢查询日志能涨到好几个GB堆在一起完全无法下手。后来我用pt-query-digest把日志跑了一遍五分钟之内就拿到了最耗时的SQL排名顺着报告去排查和优化效果立竿见影。可以说这个工具直接改变了我排查数据库性能问题的思路。以前是大海捞针现在变成了按图索骥。1.1 它能做什么简单来说pt-query-digest的核心能力有以下几点解析并聚合慢查询日志按执行时间、锁等待时间、返回行数等维度排序输出统计报告。对相同的SQL指纹进行归并即把SQL里的具体参数值去除后归为同一类统计同类SQL的整体耗时而不是被单条慢SQL带偏。支持多种输入源包括MySQL慢查询日志、通用日志、binlog、进程列表甚至可以从标准输入直接读取内容。支持多种输出格式终端直接查看、保存为文本文件、生成HTML报告等。可以和其他工具链配合比如把分析结果导入Anemometer这类可视化平台做长期的慢查询趋势监控。这里面最容易被忽视、却最关键的能力是SQL指纹归并。举个例子你的业务里经常出现SELECT * FROM orders WHERE user_id 123和SELECT * FROM orders WHERE user_id 456这类查询日志记录的是两条完全不同的文本。但pt-query-digest会敏锐地意识到它们本质上是同一类SQL然后归并为一条SELECT * FROM orders WHERE user_id ?并统计出这一类查询总共出现了多少次、平均耗时多少、最大耗时多少。这一步直接把优化优先级判断的维度给改变了从找一条慢SQL升级为找一类慢SQL。1.2 为什么用它而不是直接看日志或EXPLAIN很多新手遇到慢查询第一反应是打开日志文件肉眼寻找几条执行时间很长的SQL然后复制到客户端工具里跑一遍EXPLAIN看执行计划。我承认这是必要的流程但它有一个非常严重的盲区你看到的只是某一条SQL慢却不知道这一类型的SQL在系统里出现的频率和总体开销。举个例子日志里有一条执行了20秒的SQL但它一天只跑了一次另外一条SQL每次只花1.2秒但每分钟要跑2000次一天累计耗时超过3400分钟。你说哪个更值得优先优化凭直觉大概会选第一条但显然第二条才是真正消耗数据库资源的大户。肉眼翻日志根本无法做出这种量化对比而pt-query-digest的报告会把总执行时间、平均执行时间、出现次数同时列出来一眼就能看出真正的瓶颈在哪。另外日志文件里同一条SQL因为参数值不同会被记录成几十上百种样子。数量一旦多起来你根本归纳不出规律。pt-query-digest把这些问题都在解析阶段处理掉了。所以我的建议很明确慢查询分析的第一步是跑pt-query-digest而不是直接上去EXPLAIN那样既浪费时间又容易把方向带偏。2. 环境准备三种方式安装pt-query-digestpt-query-digest是Percona Toolkit的一部分你没法单独下载它的二进制文件需要安装整个工具包。好消息是Percona Toolkit安装并不复杂。我建议优先选择包管理器安装其次再考虑源码或Docker方案。2.1 CentOS / RHEL系安装CentOS 7、8、9这类系统推荐直接配置Percona官方软件源然后用yum安装。步骤如下# 安装Percona官方仓库 yum install -y https://repo.percona.com/yum/percona-release-latest.noarch.rpm # 启用Percona Toolkit仓库 percona-release enable percona-release-only # 安装工具包 yum install -y percona-toolkit安装完成后直接用pt-query-digest --version验证是否成功。如果网络环境不佳官方源速度很慢可以配置国内镜像源把repo文件里的repo.percona.com替换成对应的镜像地址。但切记替换之后要执行yum clean all yum makecache重新建立缓存否则可能报错。2.2 Ubuntu / Debian系安装Debian系系统类似先加Percona源再更新索引和安装wget https://repo.percona.com/apt/percona-release_latest.$(lsb_release -sc)_all.deb dpkg -i percona-release_latest.$(lsb_release -sc)_all.deb apt-get update apt-get install -y percona-toolkit这里有一个小坑提醒一下Percona源默认走HTTPS如果你的机器恰好没装apt-transport-https安装时就会报错。建议在装工具包之前先补上依赖apt-get install -y apt-transport-https ca-certificates curl gnupg lsb-release2.3 源码安装或Docker方式如果你用的是比较特殊的发行版或者内网环境完全不允许访问外网可以考虑源码安装。Percona Toolkit是用Perl写的依赖DBD::mysql、DBI等Perl模块安装相对繁琐。我的经验是非必要不建议在生产环境这么做除非你特别熟悉CPAN那一套依赖关系。如果你机器上已经有Docker也可以直接跑容器版本docker run --rm -v /var/log/mysql:/var/log/mysql percona/percona-toolkit:latest \ pt-query-digest /var/log/mysql/mysql-slow.log需要注意容器里的时区和宿主机可能不一致报告里的时间戳看起来会有偏移分析时心里有数就行。安装好之后先别急着开跑。确认一下Perl模块是否完整有些极简安装的系统缺少Time::HiRes之类的模块运行时会直接报错。遇到这种情况用包管理器补齐Perl核心模块后重新执行即可。3. 前置配置把MySQL慢查询日志打开工具再好用没有原料也是白搭。pt-query-digest平时主要吃MySQL慢查询日志所以第一步要把慢查询日志打开并配置一个合适的阈值。3.1 动态开启并验证在MySQL里可以直接执行下面三条语句不需要重启实例SET GLOBAL slow_query_log ON; SET GLOBAL long_query_time 1; SET GLOBAL log_queries_not_using_indexes ON;long_query_time 1的意思是执行时间超过1秒的SQL会被记录。这里要特别注意MySQL的long_query_time支持小数位如果你的业务压力比较大也可以设置成0.5甚至0.2。但千万别盲目追求低阈值否则日志文件的膨胀速度会非常惊人分析起来也费劲。log_queries_not_using_indexes这个开关强烈建议开启。它能帮我们抓出那些执行速度尚可但没用索引的SQL这类SQL在数据量增长之后往往突然变慢属于潜伏型隐患早发现早处理。验证配置是否生效执行SHOW VARIABLES LIKE slow_query%; SHOW VARIABLES LIKE long_query_time; SHOW VARIABLES LIKE log_queries_not_using_indexes;3.2 持久化配置动态配置只对当前实例生效MySQL重启后就会丢失。要持久化需要修改my.cnf或my.ini配置文件在[mysqld]段落下加入slow_query_log 1 slow_query_log_file /var/log/mysql/mysql-slow.log long_query_time 1 log_queries_not_using_indexes 1日志文件路径最好放在数据盘而不是系统盘避免日志增长把系统盘写满导致整个服务器不可用。配置完后重启MySQL服务再用上面的方式验证。3.3 没有慢查询日志怎么办有些托管云数据库权限受限你无法轻易打开慢查询日志。或者你已经积累了大量的binlog需要回溯历史执行情况。这时候pt-query-digest依然能干活——可以用--type binlog分析binlog也可以用--processlist模式直接抓取当前正在执行的SQL。不过现实中90%以上的场景还是慢查询日志最好用因为它专门记录那些最耗时的SQL噪声更少分析效率更高。4. 实战分析从运行命令到读懂报告这一节是整个内容的核心。我会用一个模拟场景完整演示拿到一天的慢查询日志运行pt-query-digest然后逐段解读报告告诉你每一步在看什么、为什么要看。4.1 基本命令与常用参数慢查询日志一般分布在数据库服务器上或者已经集中采集到日志平台。最标准的用法是pt-query-digest /var/log/mysql/mysql-slow.log日志文件如果很大比如几个GB也不用慌。pt-query-digest本身对单一文件的大小不敏感流式读取即可。下面这两个参数是我实际使用频率最高的--limit限制报告输出的SQL组数量。默认可能输出几十上百条终端看不过来。加--limit 30只输出前30条最耗时的视野更聚焦。--since/--until按时间段过滤。比如只看昨天10:00-12:00高峰期的日志可以写--since 2024-01-01 10:00:00 --until 2024-01-01 12:00:00。如果日志是压缩包或者正在持续写入的管道用起来也顺手zcat mysql-slow.log.gz | pt-query-digest --limit 30 tail -F mysql-slow.log | pt-query-digest --limit 30实际输出报告的分段结构很固定总体概要、SQL分布排名、单条SQL指纹详细分析。我第一次看到报告时满屏数字直接懵了完全不知道重点在哪。下面我逐块拆给你看。4.2 报告第一部分总体概要报告开头是一段整体概览类似这样数值为演示用# 120s user time, 5s system time, 47.55M rss, 226MB vsz # Current date: Mon Jan 15 12:00:00 2024 # Hostname: db1 # Files: /var/log/mysql/mysql-slow.log # Overall: 421.47k total, 458 unique SQL # Time range: 2024-01-14 00:00:00 to 2024-01-14 23:59:59 # Attribute total min max avg 95% stddev median # # Exec time 42147s 0s 66s 100ms 89ms 729ms 6ms # Lock time 0s 0s 2s 0ms 1ms 5ms 0ms # Rows sent 2.06M 0 1.12k 4.88 9.95 17.10 0.99这一段建议只抓两个信息。第一个是Overall行它告诉你总共421470条SQL归并后458个独立SQL指纹。第二个是Exec time行的total和max它告诉你这些慢SQL累计消耗了42147秒最慢的单条跑了66秒。如果total Exec time明显高于你的预期说明慢SQL已经对数据库产生了实质性压力优化刻不容缓。顺便解释一下报告里出现的95%列代表95%的SQL执行时间都小于这个值。这个指标比平均值更能反映真实用户体验因为平均值容易被极少数超长执行时间拉高。我平时看报告优先关注95%分位执行时间它代表绝大多数请求的真实感受。4.3 报告第二部分SQL分布排名概要之后工具会输出Profile部分这是整个报告最精华的内容。它把所有SQL指纹按总执行时间排序格式大致如下# Profile # Rank Query ID Response time Calls R/Call V/M Item # # 1 0xA1B2C3D4E5F60718 15273.4312 36.2% 8348 1.8302 0.01 SELECT order_detail # 2 0xB2C3D4E5F6071829 8721.2341 20.7% 17291 0.5044 0.01 SELECT user_account # 3 0x0C4D5E6F708192A3 5402.5678 12.8% 774 6.9810 0.01 UPDATE order_status每一列的意义我逐一说明Rank排名按照Response time总耗时降序排列。Query IDSQL文本去参数化后的哈希值用于唯一标识一个SQL指纹。Response time这一类SQL的执行总耗时后面的百分比是它占全部慢SQL总耗时的比例。Calls该类SQL在日志中出现的总次数。R/Call平均每次执行耗时单位秒。Item经过简化后的SQL摘要能一看就知道是查了哪张表、执行了什么操作。看到这份排名优化优先级基本就清楚了。排名第一的SQL虽然有8348次调用总耗时15273秒占36.2%单次平均耗时不算离谱但胜在总体占比高属于高频调用型问题。排名第三的UPDATE调用次数只有774次但平均耗时接近7秒属于单次极其缓慢型。这两类问题的优化路径完全不同后面展开说。4.4 报告第三部分单条SQL指纹详情排在Profile后面的是每个SQL指纹的单独分析。这里的信息量最大也最容易帮助定位具体的性能瓶颈。以排名第一的SQL指纹为例详情大致如下# Query 1: 4.35 QPS, 0.00x concurrency, ID 0xA1B2C3D4E5F60718 at byte 118172 # This item is included in the report because it matches the limit. # Scores: V/M 0.01 # Time range: 2024-01-14 00:00:00 to 2024-01-14 23:59:59 # Attribute pct total min max avg 95% stddev median # # Count 2% 8348 # Exec time 36% 15273s 0s 24s 2s 6s 4s 1s # Lock time 39% 2s 0s 10ms 0ms 1ms 1ms 0ms # Rows sent 1% 8.12k 0 1 0.97 0.99 0.15 0.99 # Rows examine 0% 0 0 0 0 0 0 0 # Query size 1% 24.85k 15 19 17.61 18.03 1.52 17.95这一段重点看几个地方。以Exec time为例avg为2秒、95%为6秒、max为24秒说明这类SQL执行时间波动极大部分时段会恶化到24秒。这通常意味着存在锁等待、InnoDB行锁冲突或者某时段数据量突增。再看Rows sent只有0.97行Rows examine是0说明这个查询的返回结果是固定的近乎于点查。如果它还很慢大概率不是扫描行数的锅而是索引失效或者统计信息过旧导致执行计划错了。顺着这个思路再去翻它的具体SQL文本。继续往下工具会展示这条SQL的完整文本和EXPLAIN结果类似这样SELECT order_detail.* FROM order_detail INNER JOIN orders ON orders.id order_detail.order_id WHERE orders.user_id 123 AND order_detail.status 1 ORDER BY order_detail.create_time DESC LIMIT 10# EXPLAIN /*!50100 PARTITIONS*/ select_type: SIMPLE table: orders type: ref possible_keys: PRIMARY,idx_user_id key: idx_user_id key_len: 8 ref: const rows: 231 filtered: 100.00% table: order_detail type: ref possible_keys: idx_order_id,idx_status key: idx_order_id key_len: 8 ref: db.orders.id rows: 11 filtered: 5.55% Extra: Using where这份EXPLAIN信息量巨大。orders表通过idx_user_id索引定位到了231行order_detail表通过idx_order_id找到了对应记录但由于status 1这个条件需要回表过滤MySQL预估的filtered只有5.55%意味着大多数行会被过滤丢弃。这种查询慢的原因就很清晰虽然走了索引但order_detail的索引设计不合理。它目前用的是idx_order_id单列索引而过滤条件status没有走进索引导致回表数据量偏大。最直接的优化方案是把单列索引改成联合索引(order_id, status)让过滤在索引扫描阶段完成回表数据量会大幅下降查询性能提升会非常明显。看到这里你应该能感受到pt-query-digest的价值它不仅仅告诉你哪条SQL慢了还通过EXPLAIN和统计列把慢的原因缩小到索引设计、锁竞争、返回数据量等具体层面这比瞎猜高效太多。5. 优化落地从报告到执行计划拿到报告后真正的工作才算开始。这一节总结我实际执行过的、行之有效的优化路线希望对你有直接帮助。5.1 索引优化优先做这个收益最大绝大多数慢查询的根因就是索引缺失或设计不合理。优化的基本顺序是先看Rows examine指标如果查询扫描的行数远大于返回行数优先考虑加索引或调整索引顺序。以我上文的例子来说最直观的做法就是创建联合索引ALTER TABLE order_detail ADD INDEX idx_order_status (order_id, status);这里要重点强调索引顺序的原则等值条件放前面排序字段放后面。如果查询里还有ORDER BY create_time DESC那么联合索引可以进一步设计成(order_id, status, create_time DESC)让排序也走索引避免额外的filesort排序。你自己实际操作时可以用EXPLAIN观察变化。加联合索引之前type可能是refrows可能上万加了之后type仍为ref但rows会大幅下降Extra里Using where或Using filesort出现得更少这就是优化的直接证据。5.2 SQL改写让优化器更容易选对执行计划有些慢查询是写法问题。最典型的那几种我列一下隐式类型转换比如WHERE user_id 123而user_id字段是整型字符串条件会导致索引失效。解决方法是让参数类型和字段类型保持一致代码侧尽量传数字类型。函数包裹索引列WHERE DATE(create_time) 2024-01-14是索引失效的重灾区。改写为WHERE create_time 2024-01-14 00:00:00 AND create_time 2024-01-15 00:00:00索引就能正常走。前导模糊匹配WHERE name LIKE %abc%无法走索引。如果业务允许改成前缀匹配LIKE abc%索引就能生效。OR条件滥用WHERE a 1 OR b 2容易导致优化器放弃索引。改写为两个查询的UNION ALL往往能显著改善执行计划。这些改写建议看起来基础但在生产事故里相当大比例就是被这类问题拖垮的。另外提醒一句改写SQL后记得回pt-query-digest里重新跑一遍报告确认原来那条SQL指纹从Profile顶部消失了才算真正闭环。5.3 参数层面MySQL配置调优当SQL本身和索引都优化完仍然存在瓶颈时就要考虑数据库参数。慢查询报告里常见的现象是Lock time占比过高说明SQL执行时间有一大块花在等待锁上。这时候关注以下几个配置innodb_buffer_pool_sizeInnoDB缓冲池大小通常是物理内存的60%-75%。设置太小会加剧磁盘IO反过来放大慢查询。innodb_lock_wait_timeout事务等待锁的超时时间默认50秒。如果业务里经常出现锁等待超时可以适当调小让失败快速暴露而不是拖垮整个实例。max_execution_time只对SELECT生效的执行超时上限。可以对个别高危业务设置避免一条SQL把数据库拖死。注意调参是最后手段不是第一手段。很多人在没分析过慢查询报告的情况下盲目调大buffer pool结果内存频繁交换性能反而更差。一定要配合监控指标看效果否则就是拿生产环境做实验。5.4 架构层面读写分离和分表如果索引、SQL、参数都优化后报告里依然有大量慢SQL说明业务量可能已经超过单库的承载能力。此时要考虑读写分离、分库分表或者引入缓存。比如对报告中的高频点查SQL加一层Redis缓存让流量先打到缓存数据库压力立刻下降。对于报表类SQL可以走只读从库避免和在线业务争抢资源。这类架构变更影响面大务必有完整的压测和回滚预案不要直接在生产上动手。6. 常见问题与排查技巧用了这么多年pt-query-digest我踩过不少坑。挑几个高频问题集中说一下省得你走弯路。6.1 工具报错找不到DBD::mysql这种情况多数出在源码安装或者精简系统上。解决办法很简单yum install -y perl-DBD-MySQL # 或 apt-get install -y libdbd-mysql-perl装完再跑一遍基本都能解决。6.2 分析结果不准慢查询日志时间格式问题如果你开启了log_timestamps为UTC而业务时区是UTC8那么pt-query-digest报告里的时间会和业务高峰期对不上。建议在分析时用--use-timezone参数指定时区或者统一把MySQL的log_timestamps配成和业务一致的时区。这个细节排查起来挺隐蔽我第一次遇到时困惑了很久。6.3 大批量日志分析太慢日志几个GB以上时pt-query-digest单核处理可能有些吃力。我的做法是先按天分片日志文件然后用xargs并行跑分析最后汇总结果mkdir -p /tmp/slowlog_daily awk /^# Time:/{filename/tmp/slowlog_daily/$3$4.log}{print filename} mysql-slow.log find /tmp/slowlog_daily -type f | xargs -P 4 -I {} pt-query-digest {} --limit 30 /tmp/report_{}.txt这么做虽然会丢失一部分跨天SQL的关联但对于定位当天的性能问题完全够用。6.4 报告里的SQL文本太长有些SQL动辄几千个字符报告看着累。可以用--report-format参数只输出关心的部分比如只要Profile和Query部分pt-query-digest --report-format profile,query mysql-slow.log这样能大幅精简输出聚焦在最重要的排名和SQL文本上。6.5 没有慢查询日志的临时排查如果你连不上服务器的日志目录又急需定位问题可以用--processlist模式实时采样当前正在执行的SQLpt-query-digest --processlist hostlocalhost,userroot,passwordyourpass它会持续抓取进程列表分析当前正在跑的SQL全貌。虽然没有历史日志全面但用在故障现场很实用能抓现行。7. 一点个人心得pt-query-digest这个工具本质上解决的是面对海量慢查询日志如何快速找到真正的优化目标这个问题。很多人以为慢查询优化就是看EXPLAIN、加索引但我觉得在那之前先让工具帮你把排序做出来才是最高效的路子。我见过太多人在一条无关紧要的SQL上折腾半天真正拖垮系统的几条反而被日志淹没了。如果你刚开始用不需要把Percona Toolkit的每个工具都学会先把pt-query-digest用熟。用熟之后你会发现它不只是慢查询分析的入口更是理解整个MySQL执行机制的一扇窗口。把报告里的指标都吃透之后再看EXPLAIN、再调参数、再设计架构每一步都会踏实很多。慢查询优化这条路找对目标比蛮干重要得多。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

DAB变换器EPS扩展移相仿真实践:从原理到优化控制 2026/9/28 7:30:59

DAB变换器EPS扩展移相仿真实践:从原理到优化控制

做中大型双向DC-DC,双有源桥(DAB)一定是绕不开的名字。它结构对称、能量可双向流动、天然带高频变压器隔离,在储能、直流微网、车载充电机、固态变压器这些场景里几乎是标配。但真正把DAB调好,往往不是拓扑本身难&…

阅读更多 →
preguntas-entrevista-react 性能优化指南:用 Set/Map 实现 O(1) 查找,告别数组 includes 扫描 2026/9/28 7:30:59

preguntas-entrevista-react 性能优化指南:用 Set/Map 实现 O(1) 查找,告别数组 includes 扫描

前端教程 【免费下载链接】preguntas-entrevista-react Preguntas tpicas sobre React para entrevistas de trabajo ⚛️ 项目地址: https://gitcode.com/gh_mirrors/pr/preguntas-entrevista-react 点击查看 免费下载 在 React 与 Next.js 应用中,数组…

阅读更多 →
C#实现自己的MCP Client:从零构建可配置的TaoToken接入骨架 2026/9/28 7:30:59

C#实现自己的MCP Client:从零构建可配置的TaoToken接入骨架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
TypeScript 2.9 破坏性变更全解析:`keyof` 泛化、剩余参数语法与严格空检查下的类型约束变化 2026/9/28 7:30:59

TypeScript 2.9 破坏性变更全解析:`keyof` 泛化、剩余参数语法与严格空检查下的类型约束变化

文档教程 【免费下载链接】TypeScript TypeScript 使用手册(中文版)翻译。http://www.typescriptlang.org 项目地址: https://gitcode.com/gh_mirrors/typ/TypeScript 点击查看 免费下载 导读 TypeScript 2.9 是本手册中一个重要的破坏性变…

阅读更多 →
Agent记忆管理实战:基于MCP与Docker的hindsight落地指南 2026/9/28 7:30:59

Agent记忆管理实战:基于MCP与Docker的hindsight落地指南

1. 从“hindsight”说起:为什么记忆是 Agent 落地的最后一公里第一次看到 “hindsight” 这个词,是在一个做智能体(Agent)的朋友群里。有人丢了一句:“你们有没有觉得,现在的 Agent 就像金鱼,聊…

阅读更多 →
Self-Play预训练:零标注数据下的逻辑驱动模型冷启动 2026/9/28 7:30:52

Self-Play预训练:零标注数据下的逻辑驱动模型冷启动

1. 这不是“无中生有”,而是让模型自己当老师“Self-Play Pretraining with Zero Data”——光看标题,很多人第一反应是:“没数据怎么训练?这不违反机器学习的基本常识吗?”我刚看到这个方向时也皱眉,翻了三…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉