<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/scripts/pretty-feed-v3.xsl" type="text/xsl"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:h="http://www.w3.org/TR/html4/"><channel><title>Jins&apos; Blog</title><description>记录技术、生活与持续成长</description><link>https://jins-blog-private.pages.dev</link><item><title>GPT-5.4:从 Java 到 Agent 开发：后端工程师在 AI 时代的转型路线</title><link>https://jins-blog-private.pages.dev/blog/transformation/transformation</link><guid isPermaLink="true">https://jins-blog-private.pages.dev/blog/transformation/transformation</guid><description>Java 后端能力迁移到 Agent 开发，重点在于补齐大模型、RAG、工具调用与工程化能力。</description><pubDate>Sun, 14 Jun 2026 21:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;从 Java 到 Agent 开发：后端工程师在 AI 时代的转型路线&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;导语&lt;/strong&gt;：AI 能力正在快速下沉到各类业务系统中。对于后端工程师而言，真正重要的变化并不是“是否会调用大模型”，而是“是否具备将大模型纳入稳定系统的能力”。Java 开发者通常已经具备接口设计、状态管理、权限控制和系统治理能力，这些能力与 Agent 开发高度相关。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;一、 为什么 Java 开发者适合转 Agent？&lt;/h2&gt;
&lt;p&gt;Agent 开发在工程本质上仍然是复杂系统设计，其核心问题包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如何理解用户输入&lt;/li&gt;
&lt;li&gt;如何拆解任务步骤&lt;/li&gt;
&lt;li&gt;如何调用外部工具&lt;/li&gt;
&lt;li&gt;如何保存和恢复上下文&lt;/li&gt;
&lt;li&gt;如何控制多轮对话状态&lt;/li&gt;
&lt;li&gt;如何校验结果并支持回滚&lt;/li&gt;
&lt;li&gt;如何在异常场景下完成重试与降级&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这些能力与 Java 后端开发高度重合。Spring Boot、接口设计、缓存、消息队列、任务调度、权限控制和监控告警等经验，并不会因为 AI 出现而失效，反而会在 Agent 场景中变得更重要。&lt;/p&gt;
&lt;p&gt;如果说传统后端的重点是实现业务接口，那么 Agent 开发的重点则是设计可控、可观测、可扩展的智能流程。转型的关键不是重新学习一套完全不同的思路，而是将既有后端能力迁移到 AI 系统中。&lt;/p&gt;
&lt;h2&gt;二、 先建立正确认知：Agent 不是更聪明的聊天机器人&lt;/h2&gt;
&lt;p&gt;Agent 不是“更聪明的聊天机器人”。从工程角度看，它是一类围绕大模型能力构建的任务执行系统。&lt;/p&gt;
&lt;p&gt;一个可用的 Agent 通常至少包含四层能力：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;理解问题&lt;/li&gt;
&lt;li&gt;规划步骤&lt;/li&gt;
&lt;li&gt;调用工具&lt;/li&gt;
&lt;li&gt;反思结果&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;它更接近于“由大模型驱动的工作流系统”。大模型负责语义理解、策略判断和内容生成，真正的执行仍然依赖系统、数据库、接口、消息队列和权限体系。&lt;/p&gt;
&lt;p&gt;因此，Agent 开发并不是对热点概念的追逐，而是将“业务开发能力”升级为“智能系统设计能力”。&lt;/p&gt;
&lt;h2&gt;三、 Java 开发者要先学什么？&lt;/h2&gt;
&lt;h3&gt;1. 大模型基础能力&lt;/h3&gt;
&lt;p&gt;首先需要理解大模型的工作机制，而不仅仅是完成 API 调用。&lt;/p&gt;
&lt;p&gt;重点包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Prompt 设计&lt;/li&gt;
&lt;li&gt;上下文窗口&lt;/li&gt;
&lt;li&gt;Token 成本&lt;/li&gt;
&lt;li&gt;温度、Top-p 等生成参数&lt;/li&gt;
&lt;li&gt;多轮对话状态管理&lt;/li&gt;
&lt;li&gt;Function Calling / Tool Use&lt;/li&gt;
&lt;li&gt;Structured Output&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;学习这一部分的目的，不是让你转型为算法工程师，而是建立对模型能力边界的判断。&lt;/p&gt;
&lt;h3&gt;2. RAG 检索增强生成&lt;/h3&gt;
&lt;p&gt;如果面向企业场景开发应用，RAG 基本属于必修内容。&lt;/p&gt;
&lt;p&gt;需要重点掌握：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;文档切分&lt;/li&gt;
&lt;li&gt;向量化&lt;/li&gt;
&lt;li&gt;向量数据库&lt;/li&gt;
&lt;li&gt;召回与重排&lt;/li&gt;
&lt;li&gt;Chunk 策略&lt;/li&gt;
&lt;li&gt;上下文拼接&lt;/li&gt;
&lt;li&gt;结果引用和溯源&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;常见技术栈包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Milvus&lt;/li&gt;
&lt;li&gt;pgvector&lt;/li&gt;
&lt;li&gt;Elasticsearch 向量检索&lt;/li&gt;
&lt;li&gt;Redis 向量能力&lt;/li&gt;
&lt;li&gt;PostgreSQL + pgvector&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;很多 Agent 型产品的底层实现，实际上是 RAG、工具调用和工作流编排的组合。就落地优先级而言，RAG 往往是最先见效的能力。&lt;/p&gt;
&lt;h3&gt;3. Agent 编排与工作流&lt;/h3&gt;
&lt;p&gt;生产环境中的 Agent 不应完全依赖模型自由发挥。更合理的方式是让模型负责决策，让流程负责执行。&lt;/p&gt;
&lt;p&gt;需要学习的内容包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;工作流编排&lt;/li&gt;
&lt;li&gt;状态机&lt;/li&gt;
&lt;li&gt;任务拆解&lt;/li&gt;
&lt;li&gt;多步骤执行&lt;/li&gt;
&lt;li&gt;失败重试&lt;/li&gt;
&lt;li&gt;人工介入&lt;/li&gt;
&lt;li&gt;结果校验&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果已经熟悉 Java 生态，可以重点关注：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Spring AI&lt;/li&gt;
&lt;li&gt;LangChain4j&lt;/li&gt;
&lt;li&gt;Temporal&lt;/li&gt;
&lt;li&gt;Apache Camel&lt;/li&gt;
&lt;li&gt;规则引擎&lt;/li&gt;
&lt;li&gt;任务调度框架&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;核心原则是：让模型负责“判断”，让系统负责“执行”。&lt;/p&gt;
&lt;h3&gt;4. 评估与可观测性&lt;/h3&gt;
&lt;p&gt;许多 AI 项目并不是失败在原型阶段，而是失败在稳定性和可观测性不足。&lt;/p&gt;
&lt;p&gt;因此还需要建立以下能力：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Prompt 版本管理&lt;/li&gt;
&lt;li&gt;输出质量评估&lt;/li&gt;
&lt;li&gt;召回效果评估&lt;/li&gt;
&lt;li&gt;对话日志分析&lt;/li&gt;
&lt;li&gt;成本监控&lt;/li&gt;
&lt;li&gt;延迟监控&lt;/li&gt;
&lt;li&gt;错误追踪&lt;/li&gt;
&lt;li&gt;A/B 测试&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Agent 系统不是一次性完成的功能，而是需要持续调优的工程系统。缺少评估体系，就无法形成有效迭代。&lt;/p&gt;
&lt;h3&gt;5. 安全与权限控制&lt;/h3&gt;
&lt;p&gt;当 Agent 接入真实业务系统后，安全问题会迅速成为核心问题。&lt;/p&gt;
&lt;p&gt;需要重点关注：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;工具权限控制&lt;/li&gt;
&lt;li&gt;敏感数据脱敏&lt;/li&gt;
&lt;li&gt;Prompt 注入防护&lt;/li&gt;
&lt;li&gt;结果越权防护&lt;/li&gt;
&lt;li&gt;审计日志&lt;/li&gt;
&lt;li&gt;人工确认机制&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Java 开发者通常在这一领域具有较强优势，因为权限、认证、审计与企业安全本就是后端开发的基础能力。&lt;/p&gt;
&lt;h2&gt;四、 推荐的技术栈路线&lt;/h2&gt;
&lt;p&gt;如果希望从 Java 平滑转向 Agent 开发，可以按以下路径推进：&lt;/p&gt;
&lt;h3&gt;基础层&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Java 17 或 21&lt;/li&gt;
&lt;li&gt;Spring Boot&lt;/li&gt;
&lt;li&gt;REST API / SSE / WebSocket&lt;/li&gt;
&lt;li&gt;Redis&lt;/li&gt;
&lt;li&gt;PostgreSQL&lt;/li&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;li&gt;Linux 基础&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;AI 应用层&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Spring AI 或 LangChain4j&lt;/li&gt;
&lt;li&gt;OpenAI / Claude / Gemini 等模型 API&lt;/li&gt;
&lt;li&gt;Function Calling&lt;/li&gt;
&lt;li&gt;RAG&lt;/li&gt;
&lt;li&gt;Embedding&lt;/li&gt;
&lt;li&gt;Vector DB&lt;/li&gt;
&lt;li&gt;Prompt 模板化&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;工程化层&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;消息队列&lt;/li&gt;
&lt;li&gt;定时任务&lt;/li&gt;
&lt;li&gt;工作流引擎&lt;/li&gt;
&lt;li&gt;日志与监控&lt;/li&gt;
&lt;li&gt;Trace 与 Metrics&lt;/li&gt;
&lt;li&gt;配置中心&lt;/li&gt;
&lt;li&gt;灰度发布&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;进阶层&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;多 Agent 协作&lt;/li&gt;
&lt;li&gt;规划与反思&lt;/li&gt;
&lt;li&gt;长短期记忆&lt;/li&gt;
&lt;li&gt;结构化输出约束&lt;/li&gt;
&lt;li&gt;自动评测&lt;/li&gt;
&lt;li&gt;Agent 安全&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;五、 最值得做的项目有哪些？&lt;/h2&gt;
&lt;p&gt;仅依靠教程很难真正掌握 Agent 开发，必须通过项目验证理解。以下项目更适合 Java 开发者入门。&lt;/p&gt;
&lt;h3&gt;1. 企业知识库问答系统&lt;/h3&gt;
&lt;p&gt;这是最常见、也最适合入门的项目形态。&lt;/p&gt;
&lt;p&gt;你要实现：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;文档导入&lt;/li&gt;
&lt;li&gt;文档切分&lt;/li&gt;
&lt;li&gt;向量检索&lt;/li&gt;
&lt;li&gt;问答生成&lt;/li&gt;
&lt;li&gt;引用来源&lt;/li&gt;
&lt;li&gt;权限隔离&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;该项目有助于系统理解 RAG、Embedding、向量库以及检索质量控制。&lt;/p&gt;
&lt;h3&gt;2. 会议纪要整理 Agent&lt;/h3&gt;
&lt;p&gt;输入会议录音转写内容后，系统自动输出：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;会议摘要&lt;/li&gt;
&lt;li&gt;任务清单&lt;/li&gt;
&lt;li&gt;责任人&lt;/li&gt;
&lt;li&gt;截止时间&lt;/li&gt;
&lt;li&gt;风险点&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;该项目适合练习结构化输出、信息抽取和结果稳定性控制。&lt;/p&gt;
&lt;h3&gt;3. 工单分流 Agent&lt;/h3&gt;
&lt;p&gt;用于自动识别用户工单的类别，并完成：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;分类&lt;/li&gt;
&lt;li&gt;优先级判断&lt;/li&gt;
&lt;li&gt;路由分配&lt;/li&gt;
&lt;li&gt;自动回复建议&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;该项目能够直接接触真实业务流程，适合企业场景验证。&lt;/p&gt;
&lt;h3&gt;4. 代码助手或代码审查 Agent&lt;/h3&gt;
&lt;p&gt;让 Agent 读取仓库内容，并执行以下任务：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;解释代码&lt;/li&gt;
&lt;li&gt;发现潜在问题&lt;/li&gt;
&lt;li&gt;生成变更建议&lt;/li&gt;
&lt;li&gt;总结 PR 风险&lt;/li&gt;
&lt;li&gt;自动补充测试建议&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;该项目与 Java 程序员的既有经验高度契合，因为你对代码结构和工程质量更敏感。&lt;/p&gt;
&lt;h3&gt;5. 运维排障 Agent&lt;/h3&gt;
&lt;p&gt;输入告警信息、日志和服务状态后，输出：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;可能原因&lt;/li&gt;
&lt;li&gt;排查步骤&lt;/li&gt;
&lt;li&gt;建议操作&lt;/li&gt;
&lt;li&gt;风险等级&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;该项目更接近真实生产环境，能够较好地体现 Agent 的系统价值。&lt;/p&gt;
&lt;h3&gt;6. 业务流程执行 Agent&lt;/h3&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;自动生成报表&lt;/li&gt;
&lt;li&gt;自动查询订单&lt;/li&gt;
&lt;li&gt;自动发邮件&lt;/li&gt;
&lt;li&gt;自动更新 CRM&lt;/li&gt;
&lt;li&gt;自动同步状态&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;该项目能够检验工具调用、权限控制与回滚机制是否完整。&lt;/p&gt;
&lt;h2&gt;六、 从 Java 转 Agent 的学习路径&lt;/h2&gt;
&lt;p&gt;如果希望高效转型，可以分为四个阶段推进。&lt;/p&gt;
&lt;h3&gt;第一阶段：补 AI 基础&lt;/h3&gt;
&lt;p&gt;目标是建立对大模型应用的基本认知。&lt;/p&gt;
&lt;p&gt;你要掌握：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Prompt&lt;/li&gt;
&lt;li&gt;Chat API&lt;/li&gt;
&lt;li&gt;Function Calling&lt;/li&gt;
&lt;li&gt;JSON 输出&lt;/li&gt;
&lt;li&gt;向量检索&lt;/li&gt;
&lt;li&gt;基础 RAG&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;第二阶段：做一个可用产品&lt;/h3&gt;
&lt;p&gt;目标是将 AI 能力接入业务流程。&lt;/p&gt;
&lt;p&gt;建议做：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;文档问答&lt;/li&gt;
&lt;li&gt;会议总结&lt;/li&gt;
&lt;li&gt;智能客服&lt;/li&gt;
&lt;li&gt;工单分类&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这一阶段不应优先追求复杂度，而应优先保证可交付性和稳定性。&lt;/p&gt;
&lt;h3&gt;第三阶段：做工作流和工具调用&lt;/h3&gt;
&lt;p&gt;目标是将单轮问答升级为任务执行。&lt;/p&gt;
&lt;p&gt;你要重点学：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;多步任务编排&lt;/li&gt;
&lt;li&gt;错误处理&lt;/li&gt;
&lt;li&gt;结果校验&lt;/li&gt;
&lt;li&gt;人工确认&lt;/li&gt;
&lt;li&gt;状态持久化&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;第四阶段：做生产级 Agent&lt;/h3&gt;
&lt;p&gt;目标是进入生产级工程化阶段。&lt;/p&gt;
&lt;p&gt;你要补：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;可观测性&lt;/li&gt;
&lt;li&gt;成本优化&lt;/li&gt;
&lt;li&gt;安全审计&lt;/li&gt;
&lt;li&gt;评测体系&lt;/li&gt;
&lt;li&gt;多模型路由&lt;/li&gt;
&lt;li&gt;缓存与降级&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;七、 Java 开发者的优势在哪里？&lt;/h2&gt;
&lt;p&gt;不少开发者在面对 AI 转型时会产生焦虑，但 Java 开发者实际上具备明显的迁移优势：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;你熟悉业务系统设计&lt;/li&gt;
&lt;li&gt;你理解后端稳定性&lt;/li&gt;
&lt;li&gt;你知道如何做权限和审计&lt;/li&gt;
&lt;li&gt;你有工程化思维&lt;/li&gt;
&lt;li&gt;你擅长把复杂问题拆成模块&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Agent 开发真正缺少的，并不是“会调用模型的人”，而是“能够将模型接入业务系统的人”。&lt;/p&gt;
&lt;p&gt;这也是 Java 开发者最容易建立竞争壁垒的方向。&lt;/p&gt;
&lt;h2&gt;八、 总结&lt;/h2&gt;
&lt;p&gt;如果你计划从 Java 转向 Agent 开发，建议不要一开始就投入到“多 Agent 自主进化”这类概念中。更合理的路径是从基础能力入手，逐步建立完整的工程闭环：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;先学会大模型 API&lt;/li&gt;
&lt;li&gt;再学 RAG&lt;/li&gt;
&lt;li&gt;再学工具调用&lt;/li&gt;
&lt;li&gt;再学工作流编排&lt;/li&gt;
&lt;li&gt;最后补安全、评估和运维&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;AI 时代真正具备长期价值的，不是单纯会写 Prompt 的开发者，而是能够将 AI 能力稳定集成到生产系统中的工程师。对于 Java 开发者来说，这条路径是清晰且可落地的。&lt;/p&gt;</content:encoded><h:img src="/_astro/thumbnail.DHM7Ch4q.jpg"/><enclosure url="/_astro/thumbnail.DHM7Ch4q.jpg"/></item><item><title>B+ 树索引原理与慢查询排查</title><link>https://jins-blog-private.pages.dev/blog/mysql_1/mysql_1</link><guid isPermaLink="true">https://jins-blog-private.pages.dev/blog/mysql_1/mysql_1</guid><description>Markdown 是一种轻量级的「标记语言」。</description><pubDate>Fri, 27 Mar 2026 21:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;图解 MySQL：小白也能看懂的 B+ 树索引原理与慢查询排查&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;导语&lt;/strong&gt;：在日常的 CRUD 开发中，数据库往往是性能的第一个瓶颈。这篇文章不聊枯燥的八股文，而是从实际业务场景出发，白话拆解 B+ 树的底层逻辑，并总结日常开发中最容易踩坑的慢查询与索引失效场景。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;一、 为什么我们需要索引？&lt;/h2&gt;
&lt;p&gt;想象一下，你的校园跑腿系统里已经积累了 10 万条订单数据。现在前端发来一个请求：查询学号为 &lt;code&gt;20230001&lt;/code&gt; 的同学发布的所有订单。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;SELECT * FROM errand_orders WHERE student_id = &apos;20230001&apos;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果没有索引，MySQL 只能像一个笨拙的图书管理员，从第一条订单开始，一条一条地对比学号，直到翻完这 10 万条数据。这在术语上叫作&lt;strong&gt;全表扫描（Full Table Scan）&lt;/strong&gt;。当并发量一大，数据库的 CPU 瞬间飙升，你的后端就会开始疯狂报错超时。&lt;/p&gt;
&lt;p&gt;而索引，本质上就是给数据库建了一本“字典的目录”。有了目录，我们就能快速定位到需要的数据页，避免盲目翻找。&lt;/p&gt;
&lt;h2&gt;二、 核心原理解析：为什么偏偏是 B+ 树？&lt;/h2&gt;
&lt;p&gt;在众多的数据结构（如哈希表、二叉树）中，MySQL 的 InnoDB 引擎唯独钟情于 B+ 树。为了看懂 B+ 树，我们只需要记住它最核心的两个设计哲学：&lt;/p&gt;
&lt;h3&gt;1. 它是“矮胖型”的（减少磁盘 I/O）&lt;/h3&gt;
&lt;p&gt;相比于普通的二叉树，B+ 树的每个节点可以容纳非常多的键值。这就意味着，哪怕你有千万级别的数据，B+ 树的高度通常也只有 3 到 4 层。要知道，数据库读取一个节点往往对应一次磁盘 I/O，树越矮，读取速度就越快。&lt;/p&gt;
&lt;h3&gt;2. 数据都在叶子节点，且用双向链表相连（天生适合范围查询）&lt;/h3&gt;
&lt;p&gt;在 B+ 树中，上面的非叶子节点只起到“路标”的导航作用，真实的完整数据（或主键值）全部安静地躺在最底层的叶子节点里。更绝的是，这些叶子节点之间用双向链表连接了起来。&lt;/p&gt;
&lt;p&gt;回到我们的跑腿系统：如果我想查“昨天到今天的所有订单”（范围查询），MySQL 只需要通过树结构快速找到昨天的第一条订单，然后顺着叶子节点的链表往后摸瓜，直接把今天的数据全部拿出来，简直丝滑！&lt;/p&gt;
&lt;h2&gt;三、 慢查询怎么排查？请出 EXPLAIN 照妖镜&lt;/h2&gt;
&lt;p&gt;懂了原理，下面来看实战。在开发中遇到慢得离谱的 SQL，第一反应绝对不是瞎猜，而是使用 MySQL 的 &lt;code&gt;EXPLAIN&lt;/code&gt; 关键字。&lt;/p&gt;
&lt;p&gt;只需要在你的 SQL 语句前面加上 &lt;code&gt;EXPLAIN&lt;/code&gt;：&lt;/p&gt;
&lt;p&gt;SQL&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;EXPLAIN SELECT * FROM errand_orders WHERE student_id = &apos;20230001&apos;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;MySQL 不会真正执行这条语句，而是会返回它的执行计划。面对一长串结果，初学者只需要死死盯住两个关键字段：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;type&lt;/code&gt;（访问类型）：&lt;/strong&gt; 衡量 SQL 好坏的直观指标。如果看到的是 &lt;code&gt;ALL&lt;/code&gt;，说明是最可怕的全表扫描；如果是 &lt;code&gt;ref&lt;/code&gt;（普通索引等值查询）或者 &lt;code&gt;range&lt;/code&gt;（索引范围查询），说明索引生效了。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;Extra&lt;/code&gt;（额外信息）：&lt;/strong&gt; 如果这里出现了 &lt;code&gt;Using filesort&lt;/code&gt;（在内存或磁盘中进行了额外的排序）或者 &lt;code&gt;Using temporary&lt;/code&gt;（使用了临时表），这通常意味着你的查询还有很大的优化空间，需要考虑调整索引。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;四、 进阶实战：联合索引与防不胜防的“索引失效”&lt;/h2&gt;
&lt;p&gt;在实际的业务开发中，单列索引往往不够用。为了应对复杂的查询条件（比如同时按学号和订单状态查询），我们经常需要把多个字段组合起来建立&lt;strong&gt;联合索引&lt;/strong&gt;。但索引也是有脾气的，稍微不注意就会直接罢工。&lt;/p&gt;
&lt;h3&gt;1. 联合索引与“最左前缀法则”&lt;/h3&gt;
&lt;p&gt;联合索引的 B+ 树是严格按照你定义索引时的字段顺序来排序的。这就像我们查实体电话簿：先按&lt;strong&gt;姓氏&lt;/strong&gt;排序，姓氏相同的再按&lt;strong&gt;名字&lt;/strong&gt;排序。&lt;/p&gt;
&lt;p&gt;假设我们在 &lt;code&gt;(student_id, status)&lt;/code&gt; 上建立了联合索引，这就必须遵循&lt;strong&gt;最左前缀法则&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;✅ &lt;code&gt;WHERE student_id = &apos;20230001&apos; AND status = &apos;WAITING&apos;&lt;/code&gt;：完美走索引。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;✅ &lt;code&gt;WHERE student_id = &apos;20230001&apos;&lt;/code&gt;：能走索引（只用了姓氏，也能缩小范围）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;❌ &lt;code&gt;WHERE status = &apos;WAITING&apos;&lt;/code&gt;：&lt;strong&gt;不走索引！&lt;/strong&gt;（跳过姓氏直接按名字查电话簿，无从下手，只能全表扫描）。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. 错题本：索引为什么突然失效了？&lt;/h3&gt;
&lt;p&gt;很多时候明明建了索引，但 &lt;code&gt;EXPLAIN&lt;/code&gt; 显示 &lt;code&gt;type&lt;/code&gt; 依然是 &lt;code&gt;ALL&lt;/code&gt;。以下三个坑，排查 Bug 时优先对比：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;坑一：隐式类型转换（最容易犯的低级错误）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;假设表里的 &lt;code&gt;student_id&lt;/code&gt; 是 &lt;code&gt;VARCHAR&lt;/code&gt; 字符串类型，但后端传参时传了整型数字：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;❌ &lt;strong&gt;错误：&lt;/strong&gt; &lt;code&gt;WHERE student_id = 20230001;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;✅ &lt;strong&gt;正确：&lt;/strong&gt; &lt;code&gt;WHERE student_id = &apos;20230001&apos;;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;原因：&lt;/strong&gt; 类型对不上时，MySQL 会偷偷在底层使用转换函数处理这个字段。铁律：&lt;strong&gt;只要对索引列使用了函数，索引立刻失效！&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;坑二：对索引列做运算或显式使用函数&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;❌ &lt;strong&gt;错误：&lt;/strong&gt; &lt;code&gt;WHERE YEAR(create_time) = 2026;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;✅ &lt;strong&gt;正确：&lt;/strong&gt; &lt;code&gt;WHERE create_time &gt;= &apos;2026-01-01&apos; AND create_time &amp;#x3C; &apos;2027-01-01&apos;;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;原因：&lt;/strong&gt; B+ 树里存的是原始日期数据，拿着 &lt;code&gt;YEAR()&lt;/code&gt; 函数计算后的结果去树里找，树根本认不出来。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;坑三：LIKE 查询的“左侧模糊”&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;✅ &lt;strong&gt;走索引：&lt;/strong&gt; &lt;code&gt;WHERE remark LIKE &apos;加急%&apos;&lt;/code&gt;（明确了开头，可以在 B+ 树里顺藤摸瓜）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;❌ &lt;strong&gt;不走索引：&lt;/strong&gt; &lt;code&gt;WHERE remark LIKE &apos;%加急%&apos;&lt;/code&gt;（开头是未知的，B+ 树无法进行初步的比较和排序）。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;五、 总结&lt;/h2&gt;
&lt;p&gt;MySQL 的性能调优是一门细致的学问。作为后端，千万不要迷信“只要加了索引就万事大吉”，建多了反而会拖慢 &lt;code&gt;INSERT&lt;/code&gt; 和 &lt;code&gt;UPDATE&lt;/code&gt; 的速度。在写完一段复杂的查询后，都应该习惯性地跑一遍 &lt;code&gt;EXPLAIN&lt;/code&gt;。把这些常见的失效场景当成避坑指南，慢慢地，写出高性能 SQL 就会成为一种肌肉记忆。&lt;/p&gt;</content:encoded><h:img src="/_astro/thumbnail._R9OsRxp.jpg"/><enclosure url="/_astro/thumbnail._R9OsRxp.jpg"/></item><item><title>Hello World</title><link>https://jins-blog-private.pages.dev/blog/helloworld/helloworld</link><guid isPermaLink="true">https://jins-blog-private.pages.dev/blog/helloworld/helloworld</guid><description>我的个人博客终于上线啦！顺便聊聊最近做 Spring Boot 毕设和初入职场做 Java 实习生的那些事。</description><pubDate>Thu, 26 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;终于，我有了一个属于自己的“秘密基地”&lt;/h2&gt;
&lt;p&gt;“折腾”大概是每一个程序员的宿命。&lt;/p&gt;
&lt;p&gt;经历了选框架、挑主题、踩坑 Cloudflare Pages 静态部署、和 Git 的 &lt;code&gt;rejected&lt;/code&gt; 报错斗智斗勇之后，Jins&apos; Blog 终于正式和大家见面了。&lt;/p&gt;
&lt;p&gt;既然是第一篇文章，就当做是一个简单的自我介绍和近况复盘吧。&lt;/p&gt;
&lt;h2&gt;理论与实践的碰撞：我的 Spring Boot 毕设&lt;/h2&gt;
&lt;p&gt;我现在是一名即将毕业的大学生，同时也是一枚正在踩坑前行的 Java 实习生。&lt;/p&gt;
&lt;p&gt;这段时间，我的主要精力除了应付面试，找实习，就是肝我的毕业设计——一套&lt;strong&gt;基于 Spring Boot 的校园跑腿服务系统&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;做这个项目的过程，其实也是我把大学里学到的那些零散的计算机网络、数据库原理、Java Web 知识，像拼图一样一块块拼凑起来的过程。&lt;/p&gt;
&lt;p&gt;当然了，现在是2026年,AI正在飞速发展，我也尝试了Vibe Coding，AI工具真的是好多，从UI设计，网站图标到前后端的技术选型以及网站的部署，都有AI的帮忙，真的是极大地提高了开发一个项目的效率。&lt;/p&gt;
&lt;p&gt;大部分时间都是在和Ai聊天，哈哈哈 :)&lt;/p&gt;
&lt;h2&gt;AI发展的好快&lt;/h2&gt;
&lt;p&gt;每隔几天就有一个优秀的AI工具诞生，感觉很容易就落后了，实习也好难找/(ㄒoㄒ)/~~&lt;/p&gt;
&lt;h2&gt;接下来写点什么？&lt;/h2&gt;
&lt;p&gt;建立这个博客的初衷，不仅是为了记录技术上的踩坑日常，也是为了给自己留一个纯粹的思考空间。&lt;/p&gt;
&lt;p&gt;路漫漫其修远兮，吾将上下而求索。&lt;/p&gt;
&lt;p&gt;你好，世界。这里是 Jins 的博客，咱们江湖再见！&lt;/p&gt;</content:encoded><h:img src="/_astro/thumbnail.D8S4JKWv.jpg"/><enclosure url="/_astro/thumbnail.D8S4JKWv.jpg"/></item><item><title>Markdown 语法支持</title><link>https://jins-blog-private.pages.dev/blog/markdown-zh</link><guid isPermaLink="true">https://jins-blog-private.pages.dev/blog/markdown-zh</guid><description>Markdown 是一种轻量级的「标记语言」。</description><pubDate>Sat, 26 Jul 2025 08:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;基本语法&lt;/h2&gt;
&lt;p&gt;Markdown 是一种轻量级且易于使用的语法，用于为您的写作设计风格。&lt;/p&gt;
&lt;h3&gt;标题&lt;/h3&gt;
&lt;p&gt;文章内容较多时，可以用标题分段：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;# 标题 1

## 标题 2

## 大标题

### 小标题
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;标题预览会打乱文章的结构，所以在此不展示。&lt;/p&gt;
&lt;h3&gt;粗斜体&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;_斜体文本_

**粗体文本**

**_粗斜体文本_**
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;p&gt;&lt;em&gt;斜体文本&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;粗体文本&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;粗斜体文本&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;链接&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;文字链接 [链接名称](http://链接网址)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;p&gt;文字链接 &lt;a href=&quot;http://%E9%93%BE%E6%8E%A5%E7%BD%91%E5%9D%80&quot;&gt;链接名称&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;行内代码&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;这是一条 `单行代码`
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;p&gt;这是一条 &lt;code&gt;行内代码&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;代码块&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;```js
// calculate fibonacci
function fibonacci(n) {
  if (n &amp;#x3C;= 1) return 1
  return fibonacci(n - 1) + fibonacci(n - 2)
}
```
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;// calculate fibonacci
function fibonacci(n) {
  if (n &amp;#x3C;= 1) return 1
  return fibonacci(n - 1) + fibonacci(n - 2)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当前使用 shiki 作为代码高亮插件，支持的语言请参考 &lt;a href=&quot;https://shiki.matsu.io/languages.html&quot;&gt;shiki / languages&lt;/a&gt;。&lt;/p&gt;
&lt;h3&gt;行内公式&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;这是一条行内公式 $e^{i\pi} + 1 = 0$
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;p&gt;这是一条行内公式 $e^{i\pi} + 1 = 0$&lt;/p&gt;
&lt;h3&gt;公式块&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;$$
\hat{f}(\xi) = \int_{-\infty}^{\infty} f(x) e^{-2\pi i x \xi} \, dx
$$
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;p&gt;$$
\hat{f}(\xi) = \int_{-\infty}^{\infty} f(x) e^{-2\pi i x \xi} , dx
$$&lt;/p&gt;
&lt;p&gt;当前使用 KaTeX 作为数学公式插件，支持的语法请参考 &lt;a href=&quot;https://katex.org/docs/supported.html&quot;&gt;KaTeX Supported Functions&lt;/a&gt;。&lt;/p&gt;
&lt;h4&gt;图片&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;![avatar](https://github.com/colaTIEZ.png)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/colaTIEZ.png&quot; alt=&quot;avatar&quot;&gt;&lt;/p&gt;
&lt;h4&gt;删除线&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;~~删除线~~
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;p&gt;~~删除线~~&lt;/p&gt;
&lt;h3&gt;列表&lt;/h3&gt;
&lt;p&gt;普通无序列表&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;- 1
- 2
- 3
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1&lt;/li&gt;
&lt;li&gt;2&lt;/li&gt;
&lt;li&gt;3&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;普通有序列表&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;1. GPT-4
2. Claude Opus
3. LLaMa
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;GPT-4&lt;/li&gt;
&lt;li&gt;Claude Opus&lt;/li&gt;
&lt;li&gt;LLaMa&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;列表里可以继续嵌套语法&lt;/p&gt;
&lt;h3&gt;引用&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;&gt; 枪响，雷鸣，剑起。繁花血景。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;枪响，雷鸣，剑起。繁花血景。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;引用里也可以继续嵌套语法。&lt;/p&gt;
&lt;h3&gt;换行&lt;/h3&gt;
&lt;p&gt;markdown 分段落是需要空一行的。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;如果不空行
就会在一段

第一段

第二段
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;p&gt;如果不空行
就会在一段&lt;/p&gt;
&lt;p&gt;第一段&lt;/p&gt;
&lt;p&gt;第二段&lt;/p&gt;
&lt;h3&gt;分隔符&lt;/h3&gt;
&lt;p&gt;如果你有写分割线的习惯，可以新起一行输入三个减号&lt;code&gt;---&lt;/code&gt; 或者星号 &lt;code&gt;***&lt;/code&gt;。当前后都有段落时，请空出一行：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;高级技巧&lt;/h2&gt;
&lt;h3&gt;行内 HTML 元素&lt;/h3&gt;
&lt;p&gt;目前只支持部分段内 HTML 元素效果，包括 &lt;code&gt;&amp;#x3C;kdb&gt; &amp;#x3C;b&gt; &amp;#x3C;i&gt; &amp;#x3C;em&gt; &amp;#x3C;sup&gt; &amp;#x3C;sub&gt; &amp;#x3C;br&gt;&lt;/code&gt; ，如&lt;/p&gt;
&lt;h4&gt;键位显示&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;使用 &amp;#x3C;kbd&gt;Ctrl&amp;#x3C;/kbd&gt; + &amp;#x3C;kbd&gt;Alt&amp;#x3C;/kbd&gt; + &amp;#x3C;kbd&gt;Del&amp;#x3C;/kbd&gt; 重启电脑
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;p&gt;使用 Ctrl + Alt + Del 重启电脑&lt;/p&gt;
&lt;h4&gt;粗斜体&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;&amp;#x3C;b&gt; Markdown 在此处同样适用，如 _加粗_ &amp;#x3C;/b&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;p&gt; Markdown 在此处同样适用，如 &lt;em&gt;加粗&lt;/em&gt; &lt;/p&gt;
&lt;h3&gt;其他 HTML 写法&lt;/h3&gt;
&lt;h4&gt;折叠块&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;&amp;#x3C;details&gt;&amp;#x3C;summary&gt;点击展开&amp;#x3C;/summary&gt;它被隐藏了&amp;#x3C;/details&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;h3&gt;表格&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;| 表头1 | 表头2 |
| ----- | ----- |
| 内容1 | 内容2 |
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;p&gt;| 表头1 | 表头2 |
| ----- | ----- |
| 内容1 | 内容2 |&lt;/p&gt;
&lt;h3&gt;注释&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;在引用的地方使用 [^注释] 来添加注释。

然后在文档的结尾，添加注释的内容（会默认于文章结尾渲染之）。

[^注释]: 这里是注释的内容
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;p&gt;在引用的地方使用 &lt;a href=&quot;%E8%BF%99%E9%87%8C%E6%98%AF%E6%B3%A8%E9%87%8A%E7%9A%84%E5%86%85%E5%AE%B9&quot;&gt;^注释&lt;/a&gt; 来添加注释。&lt;/p&gt;
&lt;p&gt;然后在文档的结尾，添加注释的内容（会默认于文章结尾渲染之）。&lt;/p&gt;
&lt;h3&gt;To-Do 列表&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;- [ ] 未完成的任务
- [x] 已完成的任务
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;[ ] 未完成的任务&lt;/li&gt;
&lt;li&gt;[x] 已完成的任务&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;符号转义&lt;/h3&gt;
&lt;p&gt;如果你的描述中需要用到 markdown 的符号，比如 _ # * 等，但又不想它被转义，这时候可以在这些符号前加反斜杠，如 &lt;code&gt;\_&lt;/code&gt; &lt;code&gt;\#&lt;/code&gt; &lt;code&gt;\*&lt;/code&gt; 进行避免。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;\_不想这里的文本变斜体\_

\*\*不想这里的文本被加粗\*\*
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;p&gt;_不想这里的文本变斜体_&lt;/p&gt;
&lt;p&gt;**不想这里的文本被加粗**&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;内嵌 Astro 组件&lt;/h2&gt;
&lt;p&gt;See &lt;a href=&quot;/docs/integrations/components&quot;&gt;User Components&lt;/a&gt; and &lt;a href=&quot;/docs/integrations/advanced&quot;&gt;Advanced Components&lt;/a&gt; for details.&lt;/p&gt;</content:encoded><h:img src="/_astro/thumbnail.HAXFr_hw.jpg"/><enclosure url="/_astro/thumbnail.HAXFr_hw.jpg"/></item><item><title>Using MDX</title><link>https://jins-blog-private.pages.dev/blog/using-mdx</link><guid isPermaLink="true">https://jins-blog-private.pages.dev/blog/using-mdx</guid><description>Learning how to use MDX in Astro</description><pubDate>Sun, 01 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This theme comes with the &lt;a href=&quot;https://docs.astro.build/en/guides/integrations-guide/mdx/&quot;&gt;@astrojs/mdx&lt;/a&gt; integration installed and configured in your &lt;code&gt;astro.config.ts&lt;/code&gt; config file. If you prefer not to use MDX, you can disable support by removing the integration from your config file.&lt;/p&gt;
&lt;h2&gt;Why MDX?&lt;/h2&gt;
&lt;p&gt;MDX is a special flavor of Markdown that supports embedded JavaScript &amp;#x26; JSX syntax. This unlocks the ability to &lt;a href=&quot;https://docs.astro.build/en/guides/markdown-content/#mdx-features&quot;&gt;mix JavaScript and UI Components into your Markdown content&lt;/a&gt; for things like interactive charts or alerts.&lt;/p&gt;
&lt;p&gt;If you have existing content authored in MDX, this integration will hopefully make migrating to Astro a breeze.&lt;/p&gt;
&lt;h2&gt;Example&lt;/h2&gt;
&lt;p&gt;Here is how you import and use a UI component inside of MDX.&lt;br&gt;
When you open this page in the browser, you should see the clickable button below.&lt;/p&gt;
&lt;p&gt;import { Button } from &apos;astro-pure/user&apos;&lt;/p&gt;
&lt;p&gt;Click Me&lt;/p&gt;
&lt;h2&gt;More Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://mdxjs.com/docs/what-is-mdx&quot;&gt;MDX Syntax Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.astro.build/en/guides/markdown-content/#markdown-and-mdx-pages&quot;&gt;Astro Usage Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Note:&lt;/strong&gt; &lt;a href=&quot;https://docs.astro.build/en/reference/directives-reference/#client-directives&quot;&gt;Client Directives&lt;/a&gt; are still required to create interactive components. Otherwise, all components in your MDX will render as static HTML (no JavaScript) by default.&lt;/li&gt;
&lt;/ul&gt;</content:encoded><h:img src="undefined"/><enclosure url="undefined"/></item></channel></rss>