MySQL核心基础:存储引擎、B+树索引与事务锁全解
1. 别急着写SQL先搞清楚MySQL到底在帮你做什么很多初学者包括我早期的状态学MySQL第一件事就是装个客户端然后照着教程敲CREATE TABLE、SELECT * FROM觉得能跑出结果就算是会了。直到后来我接手了一个运行了两三年的业务系统遇到一堆为什么这么慢为什么锁住了为什么数据对不上的问题才被迫把基础重新翻了一遍。这时候才意识到MySQL的基础不是SQL语法而是它作为一个数据库管理系统到底在什么样的架构和机制下运行。如果你只想刷完题去面试语法确实够了。但如果你想真正用MySQL干活——不管是做后端接口、做数据分析还是排查线上故障——你必须建立三张心智地图存储引擎怎么存数据、索引怎么加速查询、事务怎么保证一致性。这三张图就是MySQL所有基础中的基础。这篇文章不会教你怎么安装MySQL也不会一条条列SQL关键字。我按自己踩坑倒推回来的思路把我认为最值得先搞懂的六个核心模块串一遍全程用大白话和真实场景说话。内容定位在基础到进阶之间适合刚学完增删改查、想系统补一遍底层认知的读者也适合工作了一两年但总感觉哪里没通透的开发者。提示文中涉及的SQL示例和配置参数我已经尽量用通用场景替代具体业务字段你可以直接在自己环境里跑一遍验证。2. 存储引擎和行格式同一张表在磁盘上究竟长什么样先问一个问题你在MySQL里建了一张表INSERT了几万行数据这些数据到底是怎么落在磁盘上的如果你答不上来后面所有的索引、事务、锁优化都等于空中楼阁。2.1 InnoDB和MyISAM同样是表性格完全不同MySQL默认也是绝大多数业务场景应该用的存储引擎是InnoDB。和早期的MyISAM相比InnoDB的核心差异在三点支持事务、支持行级锁、支持崩溃恢复。这三点直接决定了它适合写多读多、需要数据一致性的业务而MyISAM只适合极端的只读场景或临时表。判断自己库里的表是什么引擎一条命令SHOW TABLE STATUS FROM your_database LIKE your_table;或者在信息模式里查SELECT TABLE_NAME, ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA your_database;我在实际工作中见过最典型的坑是某张统计用的表被建成了MyISAM平时只读没问题后来业务加了写入逻辑开始出现明明插入了数据另一个会话却查不到过一会儿又有了的情况还有人碰上表损坏直接报错的。排查到最后发现就是引擎选型错了——MyISAM不支持事务读写并发时行为完全不可控。所以选型逻辑很简单有事务诉求、有并发读写、关心数据安全 → InnoDB纯只读的归档表、临时分析表 → MyISAM 或干脆也用InnoDB省得麻烦做全文索引 → 新版MySQL的InnoDB也支持全文索引MyISAM的优势已经没了2.2 B树是InnoDB的存储骨架但不是一棵简单的树InnoDB用B树组织索引和数据这句话你可能听过。但大多数人只记了结论没想清楚两个关键数字一个InnoDB数据页默认16KB一个B树节点通常就是这样一个页。正因为节点大小固定B树才能在磁盘IO场景里发挥优势树的每一层对应一次磁盘IO而3~4层的B树已经可以存储千万级数据。也就是说走主键索引查一行数据极限情况也就3~4次磁盘IO这就是为什么索引能大幅提升查询性能的根本原因。这个页的概念还会引出另一个基础知识点——为什么建议主键用自增整数而不是UUID字符串。因为InnoDB的聚簇索引主键索引本身就是数据表的物理组织方式数据行按主键顺序物理排列。自增主键插入时是顺序追加不容易触发页分裂UUID主键则是随机插入频繁页分裂不仅带来大量碎片还会让insert性能明显变差。2.3 行格式和varchar的存储边界你以为存的是字符串其实不一定InnoDB有几种行格式COMPACT、DYNAMIC、COMPRESSED、REDUNDANT。MySQL 5.7默认DYNAMIC。这个细节看起来没用但至少回答了我之前困惑很久的问题varchar到底能装多长答案是varchar的长度上限受行大小限制默认最大行大小约65535字节但TEXT字段在DYNAMIC格式下会被溢出存储到单独页不占满本行的数据页空间所以一个表里放几个TEXT或BLOB字段完全没问题。如果你用的是老版本并且是COMPACT格式行格式对大字段的存储方式完全不同。你不需要背下每种格式的细节但至少要知道同样一张表不同行格式下的存储行为和数据上限是不一样的。遇到为什么我插入一条大字段就报Row size too large时先查行格式。3. 索引别乱建理解B树细节后才知道索引该怎么设计不少开发者的索引使用习惯是查询慢建个索引试试。然后一股脑把所有WHERE条件字段都建上索引结果有的生效有的不生效还有人问为什么索引建了查询还是慢。这一章的每个小节都是这类问题的答案。3.1 主键索引、二级索引和回表一次查询到底走了几步InnoDB里有两类索引主键索引聚簇索引叶子节点直接存整行数据。所以通过主键查询只需要在B树上定位一次就能拿到完整的数据行。二级索引普通索引叶子节点存的是索引字段值 主键值。如果你查询要用到索引字段以外的列就必须先用二级索引找到主键值再回到主键索引里取整行——这个过程叫回表。用一个例子说明-- 假设表有id(主键), name, age三个字段name上有普通索引 SELECT * FROM user WHERE name 张三;这条SQL会先走name索引找到张三对应的主键id再回表查一次才拿得到age字段。如果改成SELECT id, name FROM user WHERE name 张三;因为id和name都在name索引的叶子节点里就不需要回表这叫覆盖索引。我在优化业务SQL时最常用的一招就是把SELECT *改成只查必要的列目的之一就是提高覆盖索引命中率。这不只是少传点数据的带宽优化更是减少回表次数的核心手段。3.2 联合索引和最左前缀原则为什么用不上索引的锅常在自己联合索引复合索引是生产环境里最容易被用错的点。比如你建了一个联合索引(a, b, c)它实际上会按 a、ab、abc 三种组合分别支持查询但单独查 b 或 c 时索引基本失效。最左前缀原则说的就是查询条件必须从联合索引的最左侧列开始才能用到索引。这个原则背后是B树的排序逻辑——联合索引的Node节点先按a排序a相同再按b排序b相同再按c排序。既然第一排序键是a你直接跳过它去查b整棵树就帮不上忙。实操里最常见的错误是表里有(user_id, create_time)联合索引有人写SELECT * FROM orders WHERE create_time 2024-01-01;这条语句用不上该索引。而如果把条件补全成SELECT * FROM orders WHERE user_id 123 AND create_time 2024-01-01;联合索引就能正常生效因为 user_id 正好是最左前缀。注意这里说的用不上指的是不能高效地索引范围扫描MySQL优化器也可能选全表扫描或者用索引做松散扫描但核心规律是不变的——设计联合索引时等值条件放前面范围条件放后面这是性价比最高的放置顺序。3.3 索引失效高频场景函数、隐式转换和LIKE我整理过的索引忽然不生效清单至少九成是如下三类对索引列使用函数或表达式。比如WHERE DATE(create_time) 2024-01-01MySQL无法直接对create_time的B树做范围定位。正确做法是改成WHERE create_time 2024-01-01 00:00:00 AND create_time 2024-01-02 00:00:00。隐式类型转换。字段是varchar但查询传了数字或者反过来。MySQL会把字符串转成数字再比较索引就失效了。特别隐蔽因为结果还是对的。-- phone字段是varchar带索引 WHERE phone 13800138000 -- 失效 WHERE phone 13800138000 -- 正常LIKE前置通配符。WHERE name LIKE %张%无法使用B树的有序性因为目标字符串可能出现在任何位置。只有张%这种后缀通配才能走索引。以上三条是任何SQL性能排查里我第一个检查的项目。4. 事务隔离级别和MVCC并发下数据一致性的幕后规则你在一个高并发订单系统里A用户和B用户同时操作同一行数据MySQL靠什么保证不出现脏数据答案就是事务和锁机制以及背后的MVCC多版本并发控制。这是很多人学MySQL时最容易被绕晕的部分我尽量用一个场景讲透。4.1 四种隔离级别分别防住了什么SQL标准定义了四种隔离级别隔离级别脏读不可重复读幻读READ UNCOMMITTED可能可能可能READ COMMITTED不可能可能可能REPEATABLE READ不可能不可能可能InnoDB通过间隙锁解决SERIALIZABLE不可能不可能不可能解释一下几个术语脏读读到另一个事务没提交的数据。万一对方回滚你的查询结果就是错的。不可重复读同一个事务里同一条SELECT执行两次结果不一样。原因是另一个事务提交了update。幻读同一个事务里同一个范围查询两次行数不一样。原因是另一个事务提交了insert导致多出原本不存在的行。MySQL InnoDB默认隔离级别是REPEATABLE READ。注意InnoDB的可重复读不止通过快照读解决了不可重复读还通过间隙锁Gap Lock加临键锁Next-Key Lock在多数场景下顺带解决了幻读问题。这就是InnoDB和教科书里的标准定义不完全一致的地方——面试经常拿这个点来区分背过概念和真懂InnoDB的人。4.2 当前读和快照读普通SELECT其实不锁MVCC的核心思想是多版本。InnoDB每一行数据都有两个隐藏字段事务ID和回滚指针。修改一行数据时InnoDB不会直接覆盖旧值而是把旧版本写进undo log新版本行记录里保存事务ID和指向旧版本的指针。这样一来普通SELECT快照读走的是MVCC快照读取在我这个事务开始时间点之前已提交的数据版本不需要加锁读性能极高。UPDATE/DELETE/INSERT以及SELECT ... FOR UPDATE当前读则要加锁读的是最新已提交版本。大多数线上死锁和查询特别慢的问题就是有人把普通SELECT用于业务判断同时又和UPDATE产生了不一致的预期。比如先SELECT检查余额再UPDATE扣款——这两个操作之间如果没有锁保护就可能出现超扣。正确写法是用当前读SELECT balance FROM account WHERE id 1 FOR UPDATE;这会把这一行锁住直到事务提交或回滚期间其他UPDATE只能等待。这就是悲观锁的典型做法。4.3 实操更正用2000行order by id limit 1的慢查询来理解隐式主键排序另外一个高频场景是订单表几百万行直接SELECT * FROM orders ORDER BY id LIMIT 1秒回但ORDER BY create_time LIMIT 1就慢得离谱。原因还是那棵B树——id是主键天然有序查第一条物理上就在最左侧create_time如果没有索引MySQL只能全表扫完再排序filesort当然慢。这个例子不是为了教你取一条数据而是提醒你默认按主键排序是InnoDB物理结构的副产品任何非主键排序都会消耗额外成本。设计表和索引时把排序字段也放进索引设计里是很多资深DBA和架构师都会做的基础动作。5. 锁机制与死锁排查从原理到实战的三步定位法锁是事务一致性的执行工具但也是并发系统的麻烦来源。我还在初级的时候一看到Deadlock found when trying to get lock; try restarting transaction就头皮发麻。后来踩过两次坑总结了一套三步定位法现在基本没有处理不了的死锁。5.1 行锁、间隙锁和表锁各自什么时候出现InnoDB的锁类型大致分三种记录锁Record Lock锁住具体一行。间隙锁Gap Lock锁住索引记录之间的间隙防止其他事务在这个范围插入新值主要解决幻读。临键锁Next-Key Lock记录锁间隙锁的组合锁住一行以及它前面的间隙是InnoDB在REPEATABLE READ下的默认范围锁单位。对于DELETE FROM t WHERE id BETWEEN 10 AND 20这类条件范围操作即便当前只有10和20两条记录InnoDB也会在10到20之间的间隙加锁。不了解间隙锁的人很容易在明明没有这行数据的情况下看到插入操作一直等待。加到表锁的场景就更直观了DDL操作ALTER TABLE等通常需要LOCK TABLE不带WHERE条件的UPDATE会把所有行都锁上线上千万别这么干。5.2 死锁的必要条件与排查案例死锁是两个事务互相持有对方需要的锁且互不相让。我用一个极简例子描述事务AUPDATE t SET ... WHERE id1; 然后 UPDATE t SET ... WHERE id2;事务BUPDATE t SET ... WHERE id2; 然后 UPDATE t SET ... WHERE id1;如果A先锁了id1B先锁了id2接下来A等B释放2B等A释放1死锁形成。InnoDB的检测机制会自动回滚其中一个事务通常是代价较小那个并将错误返回给客户端。实际排查步骤我每次都是这么做的执行SHOW ENGINE INNODB STATUS重点看LATEST DETECTED DEADLOCK段落里面有事务ID、持有锁和等待锁的具体信息。对照业务代码找出两个事务加锁顺序不一致的SQL。统一所有事务的加锁顺序比如都先小id后大id或者缩短事务时间或者把大事务拆小。另外一个我常犯的错是忘记隐式加锁INSERT ... ON DUPLICATE KEY UPDATE在冲突时会对旧记录加锁SELECT ... FOR UPDATE也会对结果集加锁。排查死锁时不能只看显式UPDATE的语句所有写操作都要纳入考虑。6. EXPLAIN和慢查询日志把SQL性能问题变成看得见的证据学完上面的原理就该落到实操环节了。最快的验证方式就是你写一条SQL看MySQL到底怎么执行它。EXPLAIN就是干这个的。6.1 先看懂EXPLAIN的五个关键列EXPLAIN SELECT u.id, u.name, o.order_no FROM user u LEFT JOIN orders o ON o.user_id u.id WHERE u.id 100;输出会有一堆列我不建议你背全部先抓五个信息量最大的列名看什么常见问题type访问类型从好到坏system → const → eq_ref → ref → range → index → ALL出现ALL说明全表扫描需要重点优化key实际选中的索引为NULL说明索引没被使用rows预估扫描行数数字越大越危险但只是估算filtered经过条件过滤后剩余比例越低说明当前索引筛选性越差Extra额外信息Using filesort / Using temporary 都值得警惕type值是经常被忽略的。初学者看到查询能出结果就觉得没毛病实际上typeALL意味着MySQL把整张表从头到尾扫了一遍。数据量小无所谓一旦到百万级这种查询就会拖垮CPU和磁盘IO。6.2 慢查询日志怎么配慢查询日志是发现隐藏的烂SQL的第一工具。可以在配置里长期开启并设置阈值slow_query_log 1 slow_query_log_file /var/log/mysql/mysql-slow.log long_query_time 1 log_queries_not_using_indexes 1long_query_time设置超过1秒的SQL进慢日志MySQL 5.7之后最小可以设为0但生产环境建议1秒起步否则日志会爆炸。log_queries_not_using_indexes会把没走索引的查询也记下来就算执行很快也会记录方便发现潜在隐患。拿到慢日志后我通常用pt-query-digest或者mysqldumpslow做聚合分析先找执行次数多且平均耗时高的SQL再逐条EXPLAIN。6.3 实际优化案例一条380行的联表查询怎么压到0.08秒我处理过一个典型场景。业务反馈某列表页打开要3秒多抓到的SQL大致是SELECT p.id, p.title, s.name AS school_name FROM project p LEFT JOIN school s ON s.id p.school_id WHERE p.status 1 ORDER BY p.created_at DESC LIMIT 20;EXPLAIN之后发现project表没走索引全是ALLjoin那里的school表倒是走了主键。排查下来status1的数据占了全表的86%选择性太差MySQL觉得还不如全扫。真正的问题出在ORDER BY created_at没有索引导致即使匹配到了20条也要全部排序。修复方案是两步走在(status, created_at)上建联合索引让WHERE和ORDER BY都能命中索引。把SELECT p.id, p.title提前条件确认避免不必要的回表。改完之后rows从几十万降到几百耗时从3秒多降到0.08秒。像这种查询并不需要什么高深的调参纯粹是索引和覆盖索引的合理设计。7. 配置和日常操作里最容易踩的五个隐形坑最后分享五个我在日常维护中反复踩过、也帮别人排查过的基础坑。它们不像索引和锁那么有技术感但造成的线上事故一点都不少。7.1 utf8mb4不是可选项是必选项MySQL的utf8字符集其实是utf8mb3最大支持3字节编码存不了emoji和部分生僻字。如果建表用了utf8后来业务要存emoji要么高频报错要么报Incorrect string value。正确姿势是从建库开始就用utf8mb4CREATE DATABASE your_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;但需要注意utf8mb4_unicode_ci和utf8mb4_general_ci在排序和比较规则上有差异对中文和特殊字符的排序结果可能不同。业务如果对排序规则敏感建表时就要统一。7.2 时区问题datetime和timestamp的行为差异timestamp字段存储的是UTC时间展示时按会话时区转换datetime直接存字面值不转换。如果应用服务器和MySQL的时区设置不一致同一行数据在不同连接下查出来可能差8小时。建议数据库连接参数里显式指定serverTimezoneAsia/ShanghaiJDBC场景或time_zone08:00避免依赖系统默认值。排查问题的时候先执行SELECT NOW();看一眼当前时间对不对。7.3 连接数和连接池不是越大越好MySQL默认最大连接数1515.7版本很多新手一遇到 Too many connections 就把max_connections改到几千结果数据库负载更高了。连接数不是越大越好每个连接都要消耗内存和线程资源过多的并发连接反而会增加上下文切换和锁竞争。常见经验值是连接池上限 CPU核心数 × 2 1或者磁盘数×2具体还要看应用的每个连接平均耗时。调整连接数时要同步关注线程数、内存和CPU而不是拍脑袋加数值。7.4 mysqldump备份别忘了关键参数很多人学备份只背了一句mysqldump -u root -p db backup.sql。但这个裸命令会带来两个隐患备份期间可能因为锁表影响线上业务备份文件恢复时不带建表信息之外的重要属性。比较稳妥的备份命令是mysqldump -u root -p --single-transaction --default-character-setutf8mb4 --routines --triggers db_name backup.sql--single-transaction利用InnoDB的MVCC在备份时不锁表--routines和--triggers把存储过程和触发器也带上。7.5 备份恢复后自增主键冲突这个坑是我自己踩过才记住的机械地恢复一个备份到原有库备份里的自增计数器可能落后于线上之后新插入的数据可能撞主键。恢复完要主动检查ALTER TABLE your_table AUTO_INCREMENT 1;或者干脆让MySQL根据当前最大主键1自动重建。更严谨的做法是恢复后对比一下线上和备份的max(id)再决定是否需要修正。8. 写在最后的一些体会学MySQL基础我第一次是用一个月刷完SQL语句和函数第二次是工作一年后重新理解事务和索引第三次是带着线上故障去查锁和配置。每一次回炉都有原来如此的时刻。如果让我给新人一个学习路径建议我不会让你先从配置或架构开始而是先找一张几百万行的业务表练习写查询、看EXPLAIN、做索引优化再找一个同行配合做死锁和事务隔离级别的实验最后再碰配置和备份。顺序反了很多原理会悬浮在脑子里用不出来。文章里提到的每个坑都是我真实遇到并定位过的。不管你现在处于哪个阶段我都建议你把手头库里的索引、慢查询日志、字符集、行格式都翻出来看一眼——大概率能找出至少一个潜在问题。MySQL说到底是存储引擎 索引 事务锁 优化器的协作系统。基础不牢后面所有性能优化技巧都是无源之水。希望这篇整理能帮你少绕几条弯路也欢迎你在自己的项目里逐条验证后再形成自己的判断。

相关新闻

Oracle ROWNUM迁移瀚高数据库:分页查询改写与兼容实践

Oracle ROWNUM迁移瀚高数据库:分页查询改写与兼容实践

1. ROWNUM 替换问题是怎么暴露的:一次迁移现场的实录接手一个某在线交易系统从 Oracle 向瀚高数据库迁移的项目时,我对兼容性风险早有预期,但真正被反将一军的,不是那些复杂的 PL/SQL 包,而是应用里最不起眼的分页查询…

2026/10/10 12:51:34 阅读更多 →
YOLOv8玻璃瓶口缺陷检测实战:工业级部署与产线落地

YOLOv8玻璃瓶口缺陷检测实战:工业级部署与产线落地

简介:本资源是一套基于YOLOv8实现的玻璃瓶口缺陷高速检测系统,面向计算机视觉初学者、人工智能方向本科生及毕设/课程设计需求者,解决工业质检中瓶口微小缺陷识别精度低、部署难、可视化弱等实际问题。资源共97个文件,涵盖70个核心…

2026/10/10 12:51:34 阅读更多 →
基于PJ85718DM与STM32F215RE的本地远程温度监测方案

基于PJ85718DM与STM32F215RE的本地远程温度监测方案

1. 项目背景与核心需求拆解1.1 为什么温度监测在嵌入式与暖通场景里是个“老问题新解法”温度监测这件事,听起来像是嵌入式入门第一课——读个传感器,串口打印,完事。但真把它放到暖通空调(HVAC)的实际场景里&#xff…

2026/10/10 12:51:34 阅读更多 →

最新新闻

热电联产机组联合优化调度:Matlab+YALMIP建模风电消纳与储热电锅炉算例

热电联产机组联合优化调度:Matlab+YALMIP建模风电消纳与储热电锅炉算例

1. 冬季供暖季的弃风困局:热电联产机组到底卡在哪每年供暖季一过,风电场的同事就开始盯着调度曲线叹气:白天风光还好,一到后半夜风速上来了,风电场却得压出力,甚至有整场停机的时候。而另一边,热…

2026/10/10 16:01:52 阅读更多 →
用AI高效阅读鸿蒙源码:仓库定位、调用链与实战技巧

用AI高效阅读鸿蒙源码:仓库定位、调用链与实战技巧

简介:面向鸿蒙OS平台的“阅读”应用鸿蒙版仓库源码,特别适合鸿蒙应用开发者、对小说阅读器实现感兴趣的工程师,以及希望复用书源管理方案的技术人员。工程基于ArkTS编写主要页面与业务逻辑,并搭配svg、png等图标与图片资源&#x…

2026/10/10 16:01:52 阅读更多 →
Java IO流深度解析:字节流字符流、缓冲流与序列化实战指南

Java IO流深度解析:字节流字符流、缓冲流与序列化实战指南

1. 别被IO流的类图吓到:先搞懂设计骨架做Java开发几年后回头看,IO流其实是整个Java生态里设计最经典、也最劝退新手的模块之一。所谓“Java进阶--IO流”,不是让你把几十个类的名字背下来,而是先看清这套体系背后的两个核心设计思想…

2026/10/10 16:01:52 阅读更多 →
Vector v0.51.0 版本深度解析:OTLP 编解码、file source 去遗留化与遥测可靠性加固

Vector v0.51.0 版本深度解析:OTLP 编解码、file source 去遗留化与遥测可靠性加固

可观测性数据工程数据集成日志分析 【免费下载链接】vector A high-performance observability data pipeline. 项目地址: https://gitcode.com/GitHub_Trending/vect/vector 点击查看 免费下载 Vector v0.51.0(发布于 2025-11-04)是面向可观…

2026/10/10 16:01:52 阅读更多 →
Spring AI 2.x 深度技术解析:从架构重构到企业级落地,TaoToken 统一 Key 接入实践

Spring AI 2.x 深度技术解析:从架构重构到企业级落地,TaoToken 统一 Key 接入实践

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

2026/10/10 16:01:52 阅读更多 →
探索AI工具——我的Cursor初体验:从Base URL改到TaoToken

探索AI工具——我的Cursor初体验:从Base URL改到TaoToken

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

2026/10/10 16:00:51 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

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

2026/10/10 11:14:25 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

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

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

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

2026/10/10 11:14:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/10 10:38:42 阅读更多 →