MySQL实战笔记:从环境搭建到性能调优全流程
翻了翻自己手头的MySQL课堂笔记发现从安装环境到跑通业务、从踩坑到调优这条学习路径里几乎每一个关键节点都有值得记下来的细节。最近身边好几个朋友问的问题也正好集中在这条链路上装哪个版本、初始密码到底在哪、为什么socket连接报错、远程库的表怎么同步到本地、UPDATE和存储过程到底怎么用。索性把这份笔记重新整理一遍按我自己实际操作的顺序写出来给正准备系统学MySQL或者正在做JavaWeb、数据相关项目的同学做参考。这篇笔记不绕弯子直接按从装环境到进阶调优的顺序展开每一步都给结论、给命令、给理由。1. 装MySQL之前先把版本和渠道想清楚后面能少走很多弯路很多人学MySQL的第一步就是去官网点下载看到新版本就直接装后面吃亏了才发现问题。我的建议是动手安装之前先花五分钟把版本选型和安装渠道定下来。1.1 版本选型5.7和8.0的差距不是一星半点目前实际项目里用得最多的是MySQL 8.0系列5.7虽然还在一些老系统里跑但官方维护已经接近尾声。8.0和5.7的核心差别在于默认字符集变成了utf8mb4、支持窗口函数和公用表表达式CTE、默认认证插件换成了caching_sha2_password。这个认证插件的更换直接影响你后续用Navicat、Workbench或者JDBC去连数据库。5.7时代默认的mysql_native_password在8.0里不再是默认选项如果使用的客户端版本比较旧连接时会直接报认证失败。这个问题网上经常看到有人问其实对应的解决办法有两个方向要么升级客户端驱动到支持caching_sha2_password的版本要么在MySQL里把账号的认证插件改回mysql_native_password。我个人建议优先升级驱动因为mysql_native_password在8.0里属于兼容性保留项性能和安全表现都弱一些。8.4这个版本也值得提一句。它是8.0系列之后的一个重要里程碑很多框架的新版本开始要求8.4及以上。比如有开发者在项目里遇到“MySQL 8.4 or later is required (found 8.0)”的报错这就是项目的依赖要求与本地数据库版本不匹配导致的。遇到这种报错要么升级MySQL要么看框架能不能向下兼容。所以做新项目时别一味求新但也不能太保守先确认项目的兼容性要求再决定版本。1.2 三种安装渠道官网包、系统包管理、Docker我装MySQL的次数已经记不清了试过官网下载、apt/yum安装、Docker容器三种方式各有适用场景。安装方式适用场景优点缺点官网安装包/压缩包Windows桌面、需要精确控制安装路径时版本明确、可控性强手动配置项多初始化麻烦系统包管理器yum/aptLinux服务器上最快最省事的方式自动处理依赖和服务脚本仓库版本可能滞后Docker容器本地开发、多版本并行测试、CI环境环境隔离、启动销毁快、可重复数据持久化和网络配置要额外处理Windows上我比较推荐到官网下载MySQL Installer一步到位装好服务和Workbench工具。Linux上用包管理器装最省心比如CentOS系的yum安装命令大致是yum install mysql-server systemctl start mysqld如果是Debian/Ubuntu系把yum换成apt即可。要注意的是系统仓库里的版本往往不是最新但胜在稳定、和系统集成度高生产环境用起来反而省事。Docker方式我只在开发环境用比如本地并行测试5.7和8.0两套版本时非常方便。最小启动命令是这样docker run --name mysql8 -e MYSQL_ROOT_PASSWORDyourpassword -p 3306:3306 -d mysql:8.0用Docker的好处是环境干净不会把宿主机装得到处都是残留文件测试完一条命令就销毁。缺点是你必须自己处理好数据卷否则容器一删数据就全没了。生产环境如果用Kubernetes这类容器编排平台部署MySQL复杂度会更高需要额外考虑存储卷、高可用、故障转移这些层面我个人的建议是没十足的运维经验生产库老老实实跑在物理机或者云主机上。1.3 Linux上安装完启动服务的常见小坑Linux安装MySQL后启动服务时偶尔会遇到systemd提示加载了一个来自/etc/rc.d/init.d/mysql的LSB风格脚本打印出来大致是“mysqld.service - LSB: start and stop MySQL loaded: loaded (/etc/rc.d/init.d/...”。这个状态的实质是服务脚本还存在旧的SysV init启动方式systemd也能兼容执行但如果你同时安装了不同来源的MySQL包就可能出现服务启动脚本冲突或者端口占用。遇到这种情况我的排查顺序是先停掉所有mysqld进程再用systemctl命令统一管理。如果还有残留的init.d脚本在干扰可以把它重命名备份systemctl stop mysqld pkill -9 mysqld mv /etc/rc.d/init.d/mysql /etc/rc.d/init.d/mysql.bak systemctl daemon-reload systemctl start mysqld这样处理之后服务和socket文件都由systemd统一接管后续不会出现两个管理入口互相打架的局面。2. 初始密码和socket连接失败装好MySQL后的第一道坎装好MySQL之后很多人的第一个问题惊人地一致初始密码是什么第二个问题也高度统一为什么我连不上2.1 初始密码不在安装界面在日志文件里MySQL从5.7开始安装后root账号会生成一个随机初始密码而且不会显示在安装完成界面里。这个密码写在了日志文件中。用RPM/DEB包安装时路径一般是/var/log/mysqld.loggrep temporary password /var/log/mysqld.log输出里会有一行类似“A temporary password is generated for rootlocalhost: xxxxxxxx”的内容冒号后面的就是初始密码。第一次登录用这个密码进去后系统会强制要求修改密码否则什么都做不了ALTER USER rootlocalhost IDENTIFIED BY 你的新密码;这里有个细节容易被忽略新密码的强度必须符合validate_password组件的默认策略太简单会直接报错。开发环境如果不想要那么严格的密码策略可以先按安全要求设置一个复杂密码后面再根据个人承受能力调整。这里不展开讲绕过策略的骚操作正规项目的密码安全还是值得投入的。2.2 error 2002 (HY000)socket连接失败的排查链路MySQL客户端在Linux上默认通过Unix socket文件连接本地服务报错信息通常是这样的ERROR 2002 (HY000): Cant connect to local MySQL server through socket /tmp/mysql.sock (2)这个报错翻译成人话就是客户端想通过socket文件找MySQL服务结果发现服务没起来或者socket文件的路径不对。排查链路非常固定按顺序检查即可第一步确认mysqld进程是否在运行ps aux | grep mysqld如果进程不存在说明服务没启动先把服务拉起来再连接。第二步如果进程存在但还是连不上就去看socket文件的路径和配置文件里写的是否一致mysql -uroot -p -h 127.0.0.1 -P 3306这条命令绕过socket直接走TCP连接如果通过了说明问题就在本地socket配置上。此时打开/etc/my.cnf检查socket参数指向的路径确保客户端和服务端读到的是同一个值。很多自动初始化的脚本会把socket放在/var/lib/mysql子目录下而客户端默认找/tmp/mysql.sock两边对不上就会出现这个报错。2.3 用Navicat或Workbench连接认证插件问题是高频坑图形化工具连接MySQL 8.0时最常见的报错和认证插件有关。Workbench作为官方工具基本不会出问题但Navicat老版本在连接8.0时偶尔会提示“Authentication plugin caching_sha2_password cannot be loaded”。这就是我们前面提到的默认认证插件变更带来的兼容性问题。最简单的解决方式是把账号的插件改回mysql_native_passwordALTER USER root% IDENTIFIED WITH mysql_native_password BY 你的密码;不过我更建议直接去Navicat官网升级到新版本新版本都支持8.0的默认认证方式。生产环境里数据库账号的认证方式最好保持默认不要为了图方便把所有账号都降级成老插件安全底线还是要守住的。顺带提一句MySQL Workbench本身也是个非常好用的学习工具界面直观ER图可视化这些功能对初学者理解表结构关系特别有帮助。平时练习时用命令行敲SQL、用Workbench看数据模型两不误。3. 从UPDATE、DELETE子查询到存储过程SQL课堂笔记的进阶记忆点SQL语法看起来简单但从“能写”到“写得对”之间隔着一堆细节。这一部分整理的是我在笔记里标注最多的几个点。3.1 UPDATE语法里最容易踩的坑子查询更新同一张表很多初学者写UPDATE时喜欢直接在SET后面套子查询比如想把某张表的某列更新成这张表自身的统计结果MySQL直接报错ERROR 1093 (HY000): You cant specify target table table_name for update in FROM clause原因是MySQL不允许在同一条UPDATE语句的子查询部分直接引用正在被更新的目标表这是出于防止不可预期循环修改的考虑。解决办法是套一层临时表封装让MySQL感知不到子查询直接操作目标表。例如UPDATE emp SET salary ( SELECT avg_salary FROM ( SELECT AVG(salary) AS avg_salary FROM emp ) AS tmp );这个写法先通过派生表把平均工资算出来再更新原始记录。我在课堂上反复强调这个语法因为只要涉及批量调整业务数据几乎都会碰到。DELETE语句的删除源来自同名表时也会遇到同样限制处理思路完全一致——先把要删的数据放到一个临时结果集里再关联删除。顺便把JOIN的含义讲透。JOIN的本质就是“把多个表的行按条件组合成新的结果集”内连接只保留匹配成功的行外连接会保留某一侧不匹配的行并用NULL填充。实际项目里UPDATE和DELETE也可以配合JOIN使用比如根据另一张表的条件来更新这张表的数据UPDATE order_info o JOIN user_info u ON o.user_id u.id SET o.user_name u.name WHERE u.status 1;这个写法的优势是避免逐条循环更新一条SQL就把跨表更新做完了执行效率比写程序循环高得多。3.2 “int5”这种简单问题背后藏着类型和排序的细节热词里出现了“mysql中int5”看起来简单其实是面试里很爱延伸的话题。int5在MySQL里就是普通的算术运算SELECT id 5 FROM user拿一列数值型字段做加减完全没问题。但延伸出去的几个问题就值得注意了。一个是int(N)中的N是什么意思。很多初学者误以为int(11)表示这个字段最多存11位的数字其实不是。int(11)里的11只是显示宽度配合ZEROFILL修饰符时不足11位左边补0与存储范围完全无关。int类型的存储范围固定是-2147483648到2147483647无论括号里写几都不影响实际存储。另一个是排序时的类型陷阱。ORDER BY默认按列的原始类型排序但如果你在ORDER BY中写了表达式比如ORDER BY 列名 0那MySQL就会尝试把该列转成数值再排序。这在纯数字字符串列上很常见比如varchar字段存了9、10、2直接ORDER BY默认按字典序排结果会是10、2、9和预期完全相反。解决办法就是ORDER BY CAST(列名 AS SIGNED)或者结构性设计上避免这种字段。这类问题在面试里出现频率极高面试官想考察的其实就是候选人有没有真正理解类型和排序的底层逻辑。3.3 存储过程和触发器DELIMITER到底在解决什么问题存储过程的声明在课堂笔记里是必须掌握的内容基本语法非常好懂DELIMITER // CREATE PROCEDURE proc_get_user(IN user_id INT, OUT user_name VARCHAR(50)) BEGIN SELECT name INTO user_name FROM user WHERE id user_id; END // DELIMITER ;很多初学者不理解为什么非要写DELIMITER。原因是MySQL默认用分号作为语句结束符但存储过程内部会有多条以分号结束的SQL语句。如果不提前把结束符改成别的符号MySQL会在看到第一个分号时就认为CREATE PROCEDURE语句已经结束后面的BEGIN...END直接被当成新语句语法必然报错。触发器的写法同理也牵扯到分隔符问题。经典示例DELIMITER // CREATE TRIGGER trg_after_insert AFTER INSERT ON order_info FOR EACH ROW BEGIN INSERT INTO order_log(order_id, operate_time) VALUES (NEW.id, NOW()); END // DELIMITER ;这个触发器的作用是订单表每次插入新记录后自动往日志表里写一条操作记录。NEW关键字代表新插入的行数据UPDATE触发器中还有OLD代表更新前的旧值。触发器的好处是数据约束逻辑集中放在数据库层应用端不需要每次手动维护日志副作用也明显——如果业务逻辑复杂、触发器数量多了排查问题时很容易忽略掉那些自动执行的逻辑。我的习惯是触发器只用来做简单审计和固定格式校验复杂业务逻辑坚持放到应用层去写这样出问题时日志链路更清晰。4. 把远程库的一张表同步到本地主从复制和小规模同步实操“把远程库的这张表同步到本地”也是热词里出现频率很高的一个需求它其实包含两种场景一次性把某张表拉过来和持续地把远程表的变更同步到本地。两种做法完全不同先搞清楚需求才能选对方案。4.1 先分清需求一次性拉取还是持续同步一次性拉取适合做数据备份、报表分析、测试环境准备这种不要求实时性的任务。持续同步适合读写分离、灾备、数据仓库实时入库这样的场景。判断标准很简单如果这张表每天只拉一次就行用逻辑备份方案如果要秒级甚至分钟级自动同步就走主从复制或者订阅binlog的方案。4.2 一次性同步mysqldump是够用的组合mysqldump支持只导出单库单表命令如下mysqldump -h 远程IP -u 用户名 -p密码 数据库名 表名 /tmp/table.sql然后把这个SQL文件传到本地本地执行导入mysql -h 127.0.0.1 -u 用户名 -p密码 数据库名 /tmp/table.sql有几个参数值得记下来。导出时加--single-transaction可以在InnoDB引擎下实现一致性快照备份不锁表对线上业务影响最小。加--default-character-setutf8mb4可以避免中文乱码。如果只想同步表结构加--no-data只同步数据加--no-create-info灵活组合即可。这种方式的局限性也在明面上全量导出定时跑数据量越大耗时越长而且两次快照之间的增量是丢的。所以它只适合小数据量的非实时场景。4.3 持续同步主从复制的最小配置主从复制的原理可以简化成这样主库把每一次数据变更写入binlog从库把主库的binlog拉过来并本地执行一遍。配置过程网上有很多但照着一路操作下来能一次跑通的其实不多。主库需要开启binlog并设置server-id[mysqld] server-id1 log-binmysql-bin从库设置不同的server-id[mysqld] server-id2主库执行完配置并重启后创建复制专用的账号CREATE USER repl% IDENTIFIED BY 密码; GRANT REPLICATION SLAVE ON *.* TO repl%; FLUSH PRIVILEGES;查看主库当前的binlog位置SHOW MASTER STATUS;记下File和Position两列的值这决定了从库要从哪里开始同步。接下来在从库上执行CHANGE MASTER TO操作CHANGE MASTER TO MASTER_HOST主库IP, MASTER_USERrepl, MASTER_PASSWORD密码, MASTER_LOG_FILEmysql-bin.000001, MASTER_LOG_POS789, GET_MASTER_PUBLIC_KEY1;启动从库复制线程START SLAVE; SHOW SLAVE STATUS\G;检查输出中Slave_IO_Running和Slave_SQL_Running是否都是Yes。IO线程负责拉日志SQL线程负责执行日志两个线程都正常才算复制真的在跑。如果SQL线程报错大多数情况是主从数据初始状态不一致导致的我的建议是先确保从库和主库的数据初始一致再用从库的--skip-slave-start参数启动复制避免日志一进来就中断。MySQL 8.0开始推荐使用GTID方式配置主从好处是不用手动记录binlog文件名和位置复制关系更自动。新项目建议直接用GTID方案老项目如果已经在跑异步复制过渡时再谨慎评估。5. 性能问题不是玄学索引、锁、连接池的基本判断方法“MySQL性能调优”在热词里是一个大项但真正落到实操上第一步从来不是改参数而是看懂表结构、看懂慢查询、看懂执行计划。5.1 创建索引的正确姿势和失效场景索引类似一本书的目录没有索引的查询需要全表扫描有了索引就能快速定位目标数据。基本创建语法很简单CREATE INDEX idx_user_name ON user(name); CREATE INDEX idx_user_age ON user(age);联合索引要特别注意字段顺序MySQL遵循最左前缀原则。一个建立在(a,b,c)上的联合索引可以命中(a)、(a,b)、(a,b,c)这三种组合的查询但直接查(b,c)不会走这个索引。所以设计联合索引时把查询频率最高、区分度最好的列放在最前面效果最好。索引失效的几类典型场景总结成一张表方便对照场景示例结果对索引列使用函数WHERE YEAR(create_time)2024索引失效前导模糊查询WHERE name LIKE %张索引失效隐式类型转换WHERE varchar_col 1索引可能失效OR连接非索引列WHERE id1 OR status2索引可能失效不符合最左前缀联合索引(a,b)查b索引失效判断一条SQL到底有没有走索引最直接的工具是EXPLAINEXPLAIN SELECT * FROM user WHERE age 20;type列显示从好到差依次是system、const、eq_ref、ref、range、index、ALL。看到ALL基本就是全表扫描了就该想想怎么调整查询或者索引设计。5.2 锁表与行锁先分清是等待还是死锁MySQL的锁机制也是高频热词。InnoDB默认支持行级锁但在某些场景下仍会退化成表锁比如对无索引的字段做UPDATE/DELETE时InnoDB无法定位准确的行只能锁住整张表。这个教训我踩过很多次修改一张几百万行的表如果条件字段没索引一条UPDATE就能把整个表锁死影响线上所有读写。遇到“锁表”问题时先查当前有哪些事务在运行SELECT * FROM information_schema.INNODB_TRX\G;这个命令能列出所有正在运行的事务包括事务ID、开始时间、正在执行什么SQL。如果看到一个事务长时间不提交很可能就是它在持有锁不释放后面所有访问同一行数据的操作都被堵住了。处理办法是找到trx_mysql_thread_id然后用KILL杀掉对应的连接KILL 线程ID;注意KILL前要和业务方确认这个事务能不能中断一个正在跑大范围更新的事务被强行杀掉数据本身不会丢但业务侧会报错。查询里扫描行数过大、事务不提交、表数据量大但表结构设计不合理是锁等待三大根源。5.3 连接池和JDBC参数useSSL、sslmode到底怎么配“mysql的数据库连接池”和“mysql jdbc usessl 与 sslmode 使用”这两个热词放在一起看特别有意思因为它们分别是两代连接方式里的代表问题。连接池解决的核心问题是避免每次请求都重新建立数据库连接。建立连接的过程包含TCP握手、认证、权限校验耗时能达到几十到几百毫秒在高并发场景下是最浪费资源的环节。HikariCP是目前Java生态里最主流的连接池Druid在国内互联网公司也大量使用。核心参数就那么几个最小空闲连接数、最大连接数、连接最大存活时间、获取连接超时时间。连接池大小不是越大越好。Too many connections是数据库资源被连接池撑爆的典型报错MySQL默认最大连接数151。最合适的连接池大小与数据库服务器的CPU核心数正相关基本经验值是“CPU核心数乘以2再加上磁盘IO等待的缓冲”。很多生产事故都是连接池参数没调好并发一上来数据库先顶不住。JDBC连接MySQL时看到的useSSLfalse和sslmode参数本质是客户端和服务端之间通信是否加密的开关。自己开发环境连本机数据库useSSLfalse完全没问题因为流量不出机器。跨网络尤其是连接云数据库时建议启用SSL加密防止账号信息和查询内容在网络传输中被截获。MySQL Connector/J 8.x里的sslmode更细粒度可以设置成PREFERRED、REQUIRED、VERIFY_CA这些级别OVERRIDE到默认行为。遇到“SSL connection error”或者“Communications link failure”时先确认两端支持的协议版本和证书配置是否匹配再检查是不是服务端SSL配置和客户端参数不一致。5.4 面试题视角这些点基本必问每次带学生做模拟面试数据库部分翻来覆去问的就是这些MySQL索引底层是什么结构、为什么用B树不用哈希、事务隔离级别有哪些、MVCC解决什么问题、主从复制原理、慢查询怎么排查。把这些点全部串起来的一套标准排查思路是先用EXPLAIN看执行计划再查慢查询日志定位具体的SQL分析SQL关联的索引是否合理再检查表数据量级和锁等待情况最后才考虑调整MySQL的buffer pool、连接数等参数。很多初学者一上来就改innodb_buffer_pool_size结果没效果因为问题根本不在缓存而在一个缺失的联合索引上。调优的顺序错了做的努力基本白费。我个人的经验是学习MySQL时最忌讳的就是只看不练。哪怕只装好一个环境把每一条命令亲手敲一遍把报错信息仔细读一遍记下来的东西才是你的。这份课堂笔记里提到的所有内容从安装到主从复制再到性能排查每一条我都建议你在自己的环境里复现一次。遇到看不懂的报错就去查官方文档和日志文件那是比任何第二手资料都可靠的答案来源。

相关新闻

Atlas 300V 24G推理卡实战:昇腾NPU上跑通YOLO目标检测

Atlas 300V 24G推理卡实战:昇腾NPU上跑通YOLO目标检测

直接亮结论:Atlas 300V 24G是一块地地道道的运算加速卡,而且它专门为AI推理场景设计,不是GPU那种通用计算卡,更不是训练卡。很多人一听到“昇腾”就默认是华为的服务器芯片,然后开始纠结能不能拿来跑YOLO,实…

2026/9/23 13:31:12 阅读更多 →
电脑制作个人简历教程:一文搞懂市政公用工程后端开发避坑指南

电脑制作个人简历教程:一文搞懂市政公用工程后端开发避坑指南

电脑制作个人简历教程:一文搞懂市政公用工程后端开发避坑指南 面试被问简历里的项目细节答不上来,心里是不是发慌?别急,这不是你的错,是大多数人的通病。 很多市政公用工程从业者转后端开发时,习惯用 Word 或 PPT…

2026/9/23 13:31:12 阅读更多 →
397B Agent RL训练实战:LoRA、奖励工程与资源优化

397B Agent RL训练实战:LoRA、奖励工程与资源优化

1. 这不是又一个“大模型发布”,而是一份被反复验证的Agent训练操作手册如果你最近刷到过那条被转发上千次的推文——“LoRA一作、OpenAI o1核心成员联合发布397B Agent RL训练配方”,第一反应可能是:又一个炫技式论文?又一套不可…

2026/9/23 13:31:12 阅读更多 →

最新新闻

STM32H7高速HID实战:USB3300+ULPI物理层详解

STM32H7高速HID实战:USB3300+ULPI物理层详解

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

2026/9/25 1:49:42 阅读更多 →
电机控制面试通关:Simulink仿真从能跑通到能讲透

电机控制面试通关:Simulink仿真从能跑通到能讲透

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

2026/9/25 1:49:42 阅读更多 →
校园失物招领平台如何用区块链构建可信日志底盘

校园失物招领平台如何用区块链构建可信日志底盘

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

2026/9/25 1:49:42 阅读更多 →
MicroBlaze Bootloader全链路解析:从启动原理到Flash固化实战

MicroBlaze Bootloader全链路解析:从启动原理到Flash固化实战

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

2026/9/25 1:49:42 阅读更多 →
XMOS XU316免开发固件方案:0代码实现高端USB音频设计

XMOS XU316免开发固件方案:0代码实现高端USB音频设计

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

2026/9/25 1:49:42 阅读更多 →
5V升压充电管理芯片IP2342:多串锂电池充电方案设计与调试

5V升压充电管理芯片IP2342:多串锂电池充电方案设计与调试

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

2026/9/25 1:48:42 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →