news 2026/9/16 8:40:06

MySQL面试高频知识点全解析:从索引到事务隔离级别

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MySQL面试高频知识点全解析:从索引到事务隔离级别

大半夜刷到一条私信:“博主,MySQL面试题有没有一份直接背的?下周面试,很急。”每次看到这种问题我都又急又无奈。直接背题库确实能应付一些基础题,但MySQL面试真正卡人的,从来不是“知不知道答案”,而是“能不能把几个知识点串起来”。比如索引失效和事务隔离级别看似独立,背后的底层机制却是一套东西;主从延迟和binlog格式看似运维问题,实际是在考你对日志体系的理解深度。

所以这份汇总我不会按网上那种“50道题带答案”的流水账来写,而是把MySQL面试里最高频、最有区分度的知识块拆开讲清楚,顺手把真正的面试官考察思路点出来。内容覆盖架构、存储引擎、索引、事务、锁、MVCC、执行计划、主从复制、常见SQL和运维细节,适合准备中级和高级开发岗的人,也适合刚学完MySQL基础想找项目经验的人。建议先收藏,然后按章节过一遍,遇到不熟的地方再回到对应小节点开细看。

1. MySQL面试到底在筛什么

面试官拿到一份简历,看到“熟练使用MySQL”,心里默认你会写增删改查。所以他问出来的问题,通常不是“你会不会写SQL”,而是“你在真实场景里有没有被MySQL坑过、有没有想过为什么”。

一个典型的MySQL面试问题链条是这样的:

  • 先问一条SQL执行流程,看你对MySQL整体架构有没有概念;
  • 再顺着索引问B+树、聚簇索引、回表、索引失效,看你是不是停留在背索引优点;
  • 接着追问事务隔离级别和MVCC,看你能不能讲清楚可重复读是怎么实现的;
  • 最后甩出一个线上慢查询或死锁场景,看你的排查思路是“拍脑袋”还是有方法。

这一套下来,基本能区分出:只会写SQL的人、能调优SQL的人、能处理MySQL底层问题的人。所以下面每个大章节,我都会先给结论,再解释“为什么”,最后补上实战排查的切入角度。准备面试时,建议不要只背高亮句,要把每个“为什么”用自己的话讲一遍,能讲顺了才算真掌握。

2. 架构与引擎:一条SQL到底怎么跑完的

2.1 一条查询SQL的完整执行链路

先看最经典的一道题:“在MySQL中输入一条SELECT语句,从客户端到返回结果,经历了哪些过程?”这道题看着简单,能完整答出来的人其实不多。

标准链路是这样:

  1. 客户端通过连接器建立连接,连接器负责校验身份、获取权限,并维护连接池;
  2. 如果查询能命中查询缓存,MySQL会直接返回缓存结果。注意MySQL 8.0已经彻底移除了查询缓存,因为它的失效粒度太粗,写入一多反而成为性能瓶颈;
  3. 分析器做词法分析和语法分析,把SQL字符串解析成语法树;
  4. 优化器决定用哪个索引、以什么顺序关联表、是否做条件改写,生成执行计划;
  5. 执行器调用存储引擎的接口,逐行判断条件,把满足条件的行返回给客户端。

这里最容易被追问的点是:优化器选错索引怎么办。比如一张表有两个单列索引,WHERE a=1 AND b=2,优化器可能根据采样统计信息选择其中一个,如果统计信息不准,就会选错。临时解决方案是用FORCE INDEX强制指定索引,或者UPDATE ANALYZE TABLE更新统计信息。能从架构层面答到这一步,面试官通常会觉得你有真实调优经验。

2.2 InnoDB 和 MyISAM:不只是“事务”两个字

面试里经常出现“InnoDB和MyISAM有什么区别”,很多人第一反应是“InnoDB有事务,MyISAM没有”。对,但这只是起点。要往深了说,可以从锁粒度、崩溃恢复、外键、统计信息、全文索引这些维度展开。

能力维度InnoDBMyISAM
事务支持支持ACID不支持
锁粒度行锁+间隙锁表锁
崩溃恢复通过redo log恢复不具备崩溃恢复能力
外键支持不支持
全文索引8.0前不支持全文索引?8.0开始支持支持
数据存储聚簇索引,数据和索引在一起索引和数据分开存储

补充一句:MyISAM在8.0依然存在,但实际业务中尽量用InnoDB。原因不只是事务,而是InnoDB的崩溃恢复能力在断电、宕机场景下能保证数据不丢。MyISAM的优点是结构简单、某些只读统计查询稍快,但代价是故障后可能表损坏,数据恢复成本极高。

2.3 日志体系:redo log和binlog为什么一个都不能少

流程题里经常顺带问:“如果一次UPDATE执行到一半,MySQL突然崩溃了,怎么保证数据不丢?”答案是redo log配合WAL机制。

简单理解WAL:先写日志,再改数据。你执行UPDATE t SET age=20 WHERE id=1时,MySQL不会立刻把磁盘上那一行数据改掉,而是先把这次变更追加到redo log,再在内存的Buffer Pool里修改数据页。等到合适时机(比如checkpoint),再把脏页刷回磁盘。这样即使数据库崩了,重启时也能用redo log重放,恢复还没刷盘的操作。

binlog则不一样,它属于Server层的逻辑日志,记录的是SQL语句或者行变更内容,主要用于主从复制和数据恢复。InnoDB的redo log是物理日志,binlog是逻辑日志,两者作用不能互相替代。MySQL在提交事务时,还要保证redo log和binlog的一致性,这就涉及到“两阶段提交”:先写redo log并处于prepare状态,再写binlog,最后把redo log改成commit状态。这个机制经常在深挖题里出现,能讲清楚非常加分。

3. 索引:面试中真正区分“会用”和“懂”的题目

3.1 为什么MySQL选择B+树而不是B树或哈希索引

索引这块几乎是MySQL面试的必考重灾区。第一问通常是“InnoDB为什么用B+树”。

先说哈希索引。哈希索引能O(1)等值查询,但天然没法做范围查询,也没法支持前缀匹配和排序。业务SQL里WHERE age > 18ORDER BY id这种太常见,哈希索引直接劝退。

再说B树。B树每个节点都存数据,树的高度更低,但这也意味着节点占用空间更大,一页能存下的索引条目更少。B+树的所有数据都放在叶子节点,并且叶子节点之间用链表串起来,做范围查询时只需要沿着链表顺序扫,效率很高。这才是B+树被选中的核心原因:既保持了矮胖结构,又对范围查询极度友好。

对面试来说,能说出“叶子节点有序链表”和“非叶子节点只存索引”比单纯说“B+树效率高”有说服力得多。

3.2 聚簇索引、二级索引与回表

InnoDB表的数据本身就是一棵B+树,主键索引的叶子节点存的是整行数据,这叫聚簇索引。二级索引的叶子节点存的是主键值,而不是整行数据。

所以当你执行:

SELECT * FROM user WHERE name = '张三';

如果name列上有一个普通索引,查询流程是:先在二级索引的B+树里找到“张三”对应的主键id,再拿这个id回聚簇索引查一次完整行。这个过程叫回表。

如果改成:

SELECT id, name FROM user WHERE name = '张三';

需要的数据在二级索引里已经都有,MySQL发现不用回表就能返回结果,这时的索引就是覆盖索引。覆盖索引是优化慢查询非常常用的手段,很多查询只要把SELECT *改成覆盖需要的列,并把对应列建成联合索引,性能就有明显提升。

3.3 最左前缀原则与索引失效场景

联合索引有最左前缀原则。比如idx(a, b, c),匹配规则是:查询条件里必须从a开始连续走索引,跳过a直接用b,或者a是范围查询后再用c排序,都可能让部分索引失效。

面试里最高频的是“什么情况会导致索引失效”,这些场景最好全部记熟并理解原因:

  1. 对索引列做函数操作,比如WHERE YEAR(create_time) = 2024,因为索引存的是原始值,无法直接定位函数计算结果;
  2. 隐式类型转换,比如手机号字段是varchar,查询写成WHERE phone = 13800000000,MySQL会把字符串转成数字,导致索引失效;
  3. 使用LIKE '%abc',前导模糊查询没法走索引,但LIKE 'abc%'可以;
  4. OR条件中有一个非索引列,比如WHERE name = '张三' OR age = 20,MySQL可能放弃索引;
  5. 联合索引不满足最左前缀,比如单独用b字段或c字段。

这里要额外提醒一点:索引失效说的是“可能失效”,不是绝对。MySQL优化器会基于成本选择执行计划,有些时候即使理论上能用索引,优化器发现回表成本太高,也会选择全表扫描。所以实际判断时,不要只看理论,要结合EXPLAINtypekey字段。

3.4 索引下推是怎么回事

索引下推(Index Condition Pushdown,ICP)是MySQL 5.6引入的优化,面试高级岗容易碰到。

举个例子:联合索引idx(city, age),查询:

SELECT * FROM user WHERE city = '上海' AND age > 30;

如果没有索引下推,存储引擎先用索引把city = '上海'的记录找出来,然后逐条回表,拿到完整行后再判断age > 30。这样可能回表很多次。

有了索引下推,存储引擎在扫描索引时就能直接判断age > 30,把不符合条件的记录过滤掉,只对真正满足条件的记录回表。这能明显减少回表次数。理解这个机制后,再看EXPLAINExtra列里出现Using index condition,就不会一头雾水了。

3.5 创建索引的实践建议

面试还会问“你会怎么给一张大表加索引”,这里要体现工程判断,而不是背规则。

我的建议是:

  • 优先给WHERE条件、ORDER BY、GROUP BY涉及的列加索引;
  • 区分度高的列放在联合索引前面,比如性别字段区分度太低,一般不适合单建索引;
  • 索引列尽量短,能用前缀索引就用前缀索引,比如存储url的大字段;
  • 不要给一张表堆太多索引,写入时索引维护也有成本;
  • 频繁更新的字段,索引要谨慎,因为每次更新都伴随索引结构调整;
  • SHOW INDEX FROM table查看索引基数,用EXPLAIN验证效果。

4. 事务、锁与MVCC:把“背会的”变成“讲得清的”

4.1 ACID靠什么实现

事务四大特性ACID是基础,但面试里更爱问“每个特性是怎么落到MySQL实现上的”。

  • 原子性依赖undo log。事务执行过程中如果出错,可以用undo log回滚到事务开始前的状态;
  • 持久性依赖redo log。事务提交时,变更会先写redo log并落盘,这样即使宕机也能重放恢复;
  • 隔离性依赖锁和MVCC。多个事务并发执行时,通过行锁、间隙锁和版本链隔离彼此的操作;
  • 一致性是最终结果,由原子性、隔离性、持久性共同保证。

这样回答比单纯背诵“ACID是什么”要好得多,因为你在展示底层机制之间的关联。

4.2 隔离级别与并发问题对照表

SQL标准定义了四种隔离级别,MySQL默认是可重复读(Repeatable Read)。面试题几乎必问“脏读、不可重复读、幻读分别是什么意思,和隔离级别是什么关系”。

隔离级别脏读不可重复读幻读
读未提交可能可能可能
读已提交不会可能可能
可重复读不会不会InnoDB下基本不会
串行化不会不会不会

简单解释一下三个问题:

  • 脏读:一个事务读到了另一个事务还没提交的数据;
  • 不可重复读:同一个事务内,两次读取同一行,结果不一样,因为另一个事务提交了修改;
  • 幻读:同一个事务内,两次范围查询返回的记录数不一样,因为另一个事务插入或删除了记录。

InnoDB在可重复读级别下,通过MVCC解决了普通SELECT的幻读问题,通过next-key lock解决了当前读下的幻读问题。这一点一定重点理解,因为很多面试官会特意追问:“MySQL可重复读下幻读还存在吗?”

4.3 MVCC:可重复读是怎么实现的

MVCC全称多版本并发控制,核心是一套“版本链+ReadView”机制。

InnoDB的每行数据上隐藏着两个关键字段:DB_TRX_ID(最近修改该行的事务id)和DB_ROLL_PTR(指向undo log里旧版本记录的指针)。当一个行数据被多次修改,undo log里就形成一条版本链。

执行SELECT时,InnoDB会根据当前事务生成一个ReadView,ReadView里记录了事务开始瞬间还在活跃的事务id列表。判断一个版本是否可见时,规则大致是:

  • 如果版本的事务id比ReadView里最小事务id还小,说明是已提交的旧版本,可见;
  • 如果版本的事务id在ReadView的活跃事务数组里,说明还没提交,不可见;
  • 如果版本的事务id大于ReadView里最大事务id,说明是在ReadView生成之后才启动的,不可见。

关键是ReadView的生成时机:读已提交(RC)是每条SELECT都重新生成ReadView,所以能读到其他事务新提交的数据;可重复读(RR)是事务内第一次SELECT生成ReadView,之后一直用这一个ReadView,所以其他事务提交的新数据看不到。这就是可重复读的核心实现逻辑。

4.4 当前读、快照读和next-key lock

MVCC解决的是普通SELECT这种快照读的隔离问题。但UPDATEDELETESELECT ... FOR UPDATE属于当前读,它们必须读最新已提交版本,不能靠快照。

当前读要解决并发冲突,就得加锁。InnoDB在可重复读级别下默认使用next-key lock,也就是“记录锁+间隙锁”的组合。间隙锁锁住的是记录之间的区间,防止其他事务在区间内插入新记录,这样就能防止当前读场景下的幻读。

面试里经常举一个例子:

SELECT * FROM user WHERE age BETWEEN 20 AND 30 FOR UPDATE;

如果age上有索引,InnoDB不仅会锁住满足条件的记录,还会锁住20到30之间的间隙,其他事务往这个区间插入age=25的记录时会被阻塞。要注意:如果条件列没有索引,InnoDB在扫描全表时会对整个范围加锁,甚至锁住整张表。所以生产环境里,FOR UPDATE的条件一定要能走索引,否则很容易引发大面积锁等待。

4.5 死锁的典型场景与排查

死锁在面试里属于“高频且高区分度”的题,因为看过和没看过的人,回答质量完全不一样。

最经典的死锁场景是两个事务以不同顺序更新同一批数据:

-- 事务A UPDATE t1 SET status = 1 WHERE id = 1; UPDATE t2 SET status = 1 WHERE id = 2; -- 事务B UPDATE t2 SET status = 1 WHERE id = 2; UPDATE t1 SET status = 1 WHERE id = 1;

两边互相持有对方要的资源,最终形成环路。MySQL检测到死锁后,会回滚其中一个事务,让它释放锁。面试能答出“回滚事务量较小的一侧,让另一个事务继续执行”已经很不错。

实际排查思路更重要。遇到线上死锁,先执行SHOW ENGINE INNODB STATUS看最后一段LATEST DETECTED DEADLOCK,里面会显示两个事务等锁的SQL和涉及的表。然后再查information_schema.INNODB_TRX,看当前事务运行了多少秒、持有多少行锁。解决死锁的常见手段包括:统一事务内操作表的顺序、缩小事务范围、减少一次性加锁行数、合理设计索引避免全表锁,以及必要时降低隔离级别(慎用)。

5. EXPLAIN与慢SQL优化:实战派和背题党的分水岭

5.1 EXPLAIN怎么看才算看懂

面试官给一条慢SQL,让你分析“为什么慢”,第一步必然是EXPLAIN。但只说“看type是不是ALL”还不够,要会看一组字段。

重点字段如下:

  • type:访问类型,性能从好到差大致是systemconsteq_refrefrangeindexALL。看到ALL第一反应就是全表扫描;
  • key:实际用到的索引。如果为NULL,说明没用索引;
  • rows:预估扫描行数。这个值越小越好;
  • filtered:满足查询条件的行数占比,越低说明扫描了很多无效行;
  • Extra:特别留意Using filesortUsing temporary,出现这两个都说明排序或分组没用到索引,常见优化方向是调整索引顺序。

举个例子,一条非常常见的慢查询:

SELECT * FROM order WHERE status = 1 ORDER BY create_time DESC;

如果EXPLAIN结果里typeALLExtra里有Using filesort,说明没走索引且排序也用了临时文件。优化方向一般是建联合索引(status, create_time),这样既能等值过滤status,又能让create_time的排序直接走索引顺序。

5.2 慢SQL排查标准流程

我已经在线上踩过太多次“直接改SQL结果更慢”的坑,所以建议你形成一套固定排查流程:

  1. 开启慢查询日志,把超过1秒的SQL捞出来;
  2. 对每条慢SQL执行EXPLAIN,看type和rows;
  3. 先用覆盖索引或联合索引解决明显的全表扫描;
  4. 如果索引已经到位但仍然慢,考虑是不是数据分布不均匀,比如status=1的行占全表90%,这时索引可能反而不如全表扫描;
  5. 再检查是不是查询结果集太大,SELECT *一条SQL把几十个大字段全查出来,网络传输和临时表开销都可能成为瓶颈;
  6. 最后看并发,单条SQL不慢,但高峰期并发一上来,CPU和IO被打满,整体响应就容易变慢。

这套流程本身也是面试加分项,因为它展示的不是“背答案”,而是会做线上诊断。

5.3 深分页为什么慢,怎么优化

LIMIT 100000, 20这种深分页是业务里很常见的慢SQL。它慢在MySQL必须把前面十万行全部扫出来再丢弃,只返回最后20行。即使这些行都满足索引条件,扫描和回表成本也极高。

常见优化方案有两种。

第一种是“延迟关联”:

SELECT t.* FROM t JOIN (SELECT id FROM t WHERE ... ORDER BY id LIMIT 100000, 20) tmp ON t.id = tmp.id;

先让子查询只在二级索引上找到目标id,再回表取完整行,减少无谓回表。

第二种是“基于上一页最大id”:

SELECT * FROM t WHERE id > 上一页最大id ORDER BY id LIMIT 20;

这种方案更适合可排序的连续翻页场景,比如首页下拉加载。SQL简单,性能也好。面试时可以说,具体方案取决于业务形态:如果是按id倒序加载,用id游标最合适;如果是随机跳页,延迟关联更通用。

5.4 COUNT、ORDER BY排序里容易被问的细节

InnoDB的COUNT(*)和MyISAM不一样。MyISAM会单独记录表行数,COUNT(*)直接读出来;InnoDB因为有MVCC,不同事务看到行数可能不一样,只能实时统计,所以大表COUNT(*)可能很慢。如果业务只需要近似值,可以查information_schema.tables里的table_rows,但要知道它只是估算值,不适合精确对账场景。

排序慢的问题,根源一般是文件排序(filesort)。如果ORDER BY的字段能覆盖到索引,MySQL直接从索引里按序读,不用额外排序;如果排序列不满足最左前缀,或者排序方向不一致,就会先取数据再排序。这也是为什么联合索引(status, create_time)能同时优化过滤和排序。

6. 主从复制、日志与日常运维:容易被忽视的送分题

6.1 binlog三种格式怎么选

主从复制是分布式系统里绕不开的话题,面试题通常从binlog格式问起。

  • Statement格式:记录原始SQL语句。优点是日志量小,缺点是可能“不确定”,比如用NOW()UUID()这类函数,主从执行结果会不一致;
  • Row格式:记录每一行变化前后的值。优点是最安全、能准确回放,缺点是日志量大;
  • Mixed格式:默认用Statement,遇到不确定性函数时自动切换为Row。MySQL 8.0默认是Row,对数据一致性更友好。

在面试里,最好把binlog和redo log的区别一并答出来。redo log是InnoDB存储引擎层面的物理日志,解决崩溃恢复;binlog是MySQL Server层记录的逻辑日志,解决主从复制和时间点恢复。两者配合两阶段提交,才能同时保证存储引擎层和Server层的数据一致。

6.2 主从延迟的原因和对策

“主从延迟”也是高频题。通常原因有:

  1. 主库写入并发高,从库只有一个SQL线程在回放,压力大;
  2. 大事务,比如一次性更新百万行,或者一次删太多数据,从库要花很长时间回放;
  3. 从库硬件比主库差,磁盘IO跟不上;
  4. 从库上还有别的查询负载,抢了资源。

解决思路一般分几层:先减少大事务,把批量操作拆小;再考虑从库升级硬件、开启并行复制;紧急情况下可以把一致性要求不高的读临时分流到延迟低的节点,但不能指望这个根治问题。能结合“大事务”和“并行复制”来答,一般就能让面试官满意。

6.3 更新子查询、排序和日常运维细节

面试题里有一道隐藏坑题:“能不能在UPDATE里直接查同一张表并更新?”MySQL的答案是:不能直接做,会报错。你可能会写:

UPDATE user SET city = '上海' WHERE id IN (SELECT id FROM user WHERE city = '北京');

MySQL会报“You can't specify target table 'user' for update in FROM clause”。解决办法是包一层临时表:

UPDATE user SET city = '上海' WHERE id IN ( SELECT id FROM (SELECT id FROM user WHERE city = '北京') tmp );

这种题目其实是在考你是不是真写过批量数据处理脚本,而不是只会单向背诵。

日常运维方面,还有几个点容易被面试官顺手考到:

  • 排序相关:ORDER BY col ASC/DESC,如果联合索引中列排序方向不一致,可能没法完全利用索引;
  • 存储过程:能说出DELIMITERCALL的用法就够了,不用背复杂写法;
  • 常用命令:SHOW PROCESSLIST查阻塞会话,SHOW CREATE TABLE看表结构,ANALYZE TABLE更新统计信息;
  • 客户端工具:MySQL Workbench适合调试和可视化,Navicat在Windows下很多人用,但纯命令行在面试场景里更显基本功。

6.4 MySQL 8.0安装和Windows下自动备份

有些面试聊到项目环境时会问到“你怎么在本机装MySQL的”,虽然不算算法题,但说得太糙也会减分。

以8.0.46压缩版为例,通用步骤是:解压到一个无中文无空格的目录,配置my.ini里的basedir和datadir,用管理员权限执行mysqld --initialize --console初始化并记住临时密码,然后执行mysqld --install注册服务,最后net start mysql启动并用临时密码登录改密码。如果更习惯容器,也可以直接用:

docker run --name mysql8 -e MYSQL_ROOT_PASSWORD=你的密码 -d -p 3306:3306 mysql:8.0

Windows下要定期备份MySQL,最简单的做法是写一个bat脚本:

mysqldump -uroot -p你的密码 数据库名 > D:\backup\db_%date:~0,10%.sql

再用Windows计划任务每天执行。虽然生产环境会有更复杂的备份系统,但面试时能说出这套小方案,反而显得你确实做过实际落地的事情。

7. 如果准备时间有限,我建议这样抓重点

如果你离面试只剩三天,我不建议把每道题都背得滴水不漏。更高效的做法是抓“三串一”:索引串、事务串、日志串。

第一串是索引:从B+树聊到聚簇索引、回表、覆盖索引、最左前缀、索引失效,再落到EXPLAIN和慢SQL优化。这一串几乎覆盖了MySQL面试的百分之三十。

第二串是事务:从ACID聊到隔离级别、MVCC、当前读、next-key lock、死锁,再落到线上锁等待排查。这一串又能覆盖百分之三十。

第三串是日志:从redo log聊到binlog、两阶段提交、主从复制、主从延迟。这一串能把存储层问题、复制问题和数据恢复问题全部串起来。

剩下的存储引擎对比、常用SQL细节、安装配置、备份方案,都属于“知道就能拿分,不知道也不至于全盘崩”的补充项,放在最后一晚扫一遍就够了。我个人面试别人的时候,最怕的不是候选人不会,而是只会背标准答案。只要你能把上面这三串知识用自己的话讲清楚,再能举出一个真实调优场景,面试官基本不会再为难你。把这些点收藏下来,约面试前再快速过一遍,比盲目刷一百道题有用得多。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/16 8:39:42

NestJS项目部署到阿里云ECS全指南:踩坑记录与生产环境配置详解

1. 你以为部署很简单,其实坑都在路上上周五晚上十点半,我坐在电脑前看着阿里云 ECS 控制台里那只运行了六分钟又自动退出的 Node 进程,整个人是崩溃的。日志里只有一行Error: listen EADDRINUSE: address already in use :::3000,…

作者头像 李华
网站建设 2026/9/16 8:39:24

STM32F103C8T6图书馆环境监测系统:原理图+仿真+稳定OLED驱动

1. 这不是“又一个STM32温湿度项目”,而是一套可直接抄作业的图书馆级环境监测落地方案你搜“STM32 图书馆”出来的结果,大概率是三类东西:一是学生课设报告,代码里写着“仅供学习”,但main.c里连串口初始化都漏了两行…

作者头像 李华
网站建设 2026/9/16 8:39:17

腾讯云Ubuntu 24.04上用Docker部署PostgreSQL实战与避坑指南

前阵子帮客户在一台腾讯云 Ubuntu 24.04 服务器上用 Docker 部署了一套 PostgreSQL,整个过程踩了几个坑,也积累了一些值得记录的细节。这几天正好有空,把完整的部署过程和思考整理出来,给同样想在云服务器上用容器跑数据库的朋友做…

作者头像 李华
网站建设 2026/9/16 8:38:56

BLE低功耗设计-第14章第7题-如何确保蓝牙芯片生产校准的一致性

蓝牙面试题解析:如何确保蓝牙芯片生产校准的一致性? 难度:⭐⭐⭐ 中等 | 场景:社招二面、生产校准 | 高频:🔥🔥🔥 标准答案 生产校准一致性靠标准化的测试流程(统一设备/环境/脚本)、芯片级参数校准(电压/时钟/温度传感器)、统计过程控制(SPC)监控、批次验证,确保…

作者头像 李华
网站建设 2026/9/16 8:38:14

ESP32-S3 N16R8开发实战:PSRAM与Flash深度优化指南

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

作者头像 李华