准备过MySQL面试的朋友大概率都经历过这种状态网上搜“mysql面试题”跳出来几百篇八股清单事务隔离级别、索引数据结构背得滚瓜烂熟结果面试官一句“你线上MySQL报error 2002 (HY000)第一反应查什么”很多人当场就懵了。这篇文章我想换个思路不适合按题目列表机械刷题而是结合最近技术社区里高频搜索的词——安装排错、锁原理、事务处理、主从复制、存储过程、连接池、函数使用这些方向把面试题背后的考点逻辑拆开说说每一类题面试官到底想考察什么以及你怎么回答才能让自己从背答案的人里跳出来。内容适合正在准备后端、运维、DBA岗位面试的同学也适合想用一台真实MySQL环境自查能力边界的开发者。1. 从热搜词看面试风向大家在搜什么面试官就在问什么1.1 热搜词拆出的六大能力层我花了一点时间把近期和MySQL相关的热搜词做了归类你会发现这些东西其实高度可预测几乎可以映射到面试考察的六个层次能力层热搜词举例面试中的考察方式安装部署mysql安装教程、linux安装mysql、docker安装mysql、rpm安装mysql、windows安装mysql8现场拷问部署流程、一键脚本和手动部署的区别、常见启动失败根因基础操作mysql设置默认值为0、mysql中int5、mysql将字符串转为日期、mysql常用函数、mysql排序笔试题、白板题、隐含细节的选择题报错排查mysql ssl连接错误、error 2002 (hy000)、centos查看mysql初始密码、mysql锁表、mysql数据库连接池连环追问“遇到这个报错你怎么一步步查”原理进阶mysql事务处理、mysql锁原理及面试题、mysql创建索引、mysql性能调优、mysql存储过程考察是否理解底层机制而非只记结论架构运维mysql主从复制、把远程库的这张表同步到本地、mysql表结构自动转tdengine超级表子表给一个业务场景让你设计方案由浅入深追问工具与生态navicat、dbeaver离线驱动、mysql下载官网、mysql命令大全侧面考察工程素养和上手能力这个表不是让你背的而是要你意识到面试官手里的题库基本都来自一线开发者和运维真正遇到的问题。热搜词背后是大量真实的生产故障、操作困惑和踩坑记录把这些词当成“需求清单”来准备比漫无目的刷题高效得多。1.2 从热搜词反推命题逻辑很多面试题其实就是把热搜词换了一层问法。举一个很典型的例子热度很高的“mysql设置默认值为0”看起来是个操作问题但面试官只需要加一句话就变成了经典陷阱题——“有个表要把某字段默认值设为0你怎么写int(11)能存储的数最大是多少”如果你只记得ALTER TABLE t ALTER COLUMN num SET DEFAULT 0;说明你停留在“会操作”层面。如果你能继续说“int(11)里的11是显示宽度不是存储上限在MySQL 8.0.19之后这种显示宽度语法已经被移除ZEROFILL也不推荐使用”那面试官对你的判断就完全不同了。同样“mysql中int5”“mysql将字符串转为日期”这类热词几乎是笔试题的原型。它们考察的从来不是“这个函数怎么写”而是你是否真的踩过这些坑、理解数据类型的边界和隐式转换规则。所以下文每一章我都会先用这类热搜词引出考点再讲透机制。2. 事务、锁与隔离级别这几道高频题别只会背八股2.1 从“事务四大特性”讲到日志与崩溃恢复“说说事务的ACID”这是MySQL面试的必问题但大多数人的回答停留在概念原子性、一致性、隔离性、持久性。这样答不是错只是太平淡没有展示出你真的理解InnoDB是怎么做到的。面试官真正想听的是这四个特性背后对应的机制。原子性和持久性靠的是redo log和undo log配合事务提交前先写redo log预写日志崩溃后重放redo log恢复已提交的数据事务回滚时靠undo log把旧版本数据链回去。隔离性靠的是锁和MVCC。一致性则是前面三者共同作用的结果同时还要靠约束、触发器这类完整性手段兜底。我建议的回答路径是先一句话定义ACID然后立刻把话题引到“InnoDB的实现手段”主动说出redo log、undo log、锁、MVCC四个关键词。此时面试官大概率会顺着你的话追问“那你讲讲MVCC是怎么实现快照读的”。这就把被动答题变成了主动引导。2.2 锁的粒度与间隙锁隔离级别的底层答案锁这部分的追问通常从“InnoDB有哪些锁”开始。你需要把层次讲清楚全局锁FTWRL、表级锁MDL锁、LOCK TABLES、行级锁共享锁S、排他锁X还有一类容易被忽略的意向锁IS、IX。面试官最爱问的其实是间隙锁Gap Lock和临键锁Next-Key Lock。为什么需要它们因为InnoDB默认的隔离级别是REPEATABLE READ要解决幻读问题光靠行锁不够——你在WHERE id 100查了一批行另一个事务往这个范围里插入了新行第二次查就会出现“幻影行”。InnoDB的解法不是锁住所有未来可能插入的行而是在RR级别下对扫描范围加间隙锁配合行锁形成Next-Key Lock锁住的是“记录记录之间的间隙”。回答的时候最好带一个例子-- 事务A SELECT * FROM orders WHERE id 100 FOR UPDATE; -- 事务B INSERT INTO orders (id, amount) VALUES (101, 999); -- 会被阻塞因为(100, 下一个索引值)的间隙被锁了能讲出这个例子说明你是真的理解而不是背定义。还要补充一句间隙锁只在RR级别下生效在READ COMMITTED级别下会被优化掉这也是很多高并发系统宁可选用RC的原因之一。2.3 隔离级别连环追问隔离级别题基本是必考四个级别分别解决什么问题、会带来什么问题必须脱口而出READ UNCOMMITTED脏读、不可重复读、幻读都可能。READ COMMITTED解决脏读但同一事务内两次查询可能结果不同这是不可重复读多数数据库默认级别。REPEATABLE READ解决不可重复读InnoDB下还通过间隙锁解决了幻读MySQL默认级别。SERIALIZABLE所有读都是当前读相当于全部加锁并发极低。这里有个高频追问“为什么MySQL默认用RR而Oracle默认用RC”别说“历史原因”就完了要补一句MySQL的binlog在 STATEMENT 格式下如果隔离级别是RC会由于无法保证日志里记录的SQL在备库重放时和主库执行顺序完全一致导致主从数据不一致RR配合间隙锁可以更安全地保证复制一致性。虽然现在binlog推荐用ROW格式RC已经可以通过row格式实现安全的复制但历史推动默认值是RR。听到你能说出这层面试官会愿意和你继续深聊。2.4 死锁排查把实操经验“说”给面试官听锁相关的另一个高频题是“你线上遇到过死锁吗怎么排查”很多人回答“kill掉一个事务”没有排查过程其实是不会的。我的排查套路是固定的面试也这么讲SHOW ENGINE INNODB STATUS\G重点看“LATEST DETECTED DEADLOCK”段落里面有发生死锁的两条SQL、涉及的锁记录。查information_schema.innodb_trx看当前有哪些事务在跑、锁了哪些表、已经运行多久。查sys.innodb_lock_waits它能直接告诉你哪个事务阻塞了哪个事务。定位到超时事务后和业务方确认能否KILL对应线程ID。解决思路也要提最常见的死锁是两个事务以不同顺序更新同一组记录。比如事务A先更新id1再更新id2事务B先更新id2再更新id1两者互相等锁。规范做法是让所有事务按固定的记录顺序操作另外可以把大事务拆小减少锁持有时间再不行就考虑降低隔离级别或优化索引减少锁范围。3. 索引与SQL优化面试官真正想听的分析细节3.1 为什么是B树不是背结论而是讲对比索引考点必有一问“为什么InnoDB用B树而不用哈希、二叉树或者B树”这个问题的回答质量最能拉开差距。关键逻辑可以这样推哈希索引能做到O(1)查找但无法支持范围查询和排序所以直接淘汰。二叉树在数据量大时树高会很高最差退化成链表磁盘I/O次数太多。B树虽然每个节点能存多个键值但它的数据分散在每个节点里范围查询要中序遍历整棵树而且中间节点存了数据导致同样高度的树存的数据量变少。B树的非叶子节点只存索引键每个节点能容纳更多键树更矮数据只存在叶子节点叶子节点之间用链表串联范围查询只需要找到起点然后沿链表向后遍历对磁盘预读也极其友好。更进阶一层可以提“页”InnoDB默认页大小16KBB树一个非叶子节点能存大约16KB / (8B指针 若干字节索引键)个键三层树已经能支撑千万级数据检索这正好对应了“三层B树可以撑起2000万行左右的数据”这个面试常见结论。能把页大小、树高、数据量之间的关系算出来这款题就稳了。3.2 聚簇索引、二级索引、回表和覆盖索引索引的底层结构聊完之后紧接着就是索引分类。InnoDB的数据本身是按主键聚簇存储的主键索引的叶子节点直接存整行数据这就是聚簇索引其他二级索引的叶子节点存的是主键值。于是“查二级索引再通过主键找整行”的过程就叫回表。这个机制衍生出两个必考技巧最左前缀原则和覆盖索引。最左前缀说的是联合索引(a,b,c)可以匹配(a)、(a,b)、(a,b,c)三种查询条件但直接查b或c走不了这个索引因为索引是按a、b、c顺序排序的。覆盖索引则是让查询的字段全部包含在索引里省掉回表比如-- 联合索引(a,b)查询两列都在索引内直接返回无需回表 SELECT a, b FROM t WHERE a 1;回答时配上“覆盖索引是优化高频查询最廉价的手段比加缓存、分库分表成本小得多”这句体会面试官就知道你在生产环境优化过慢查询。3.3 索引失效踩坑集的浓缩考点“哪些情况下索引会失效”这道题几乎必出。整理一套完整清单背下来也要会解释为什么失效对索引列使用函数或表达式如WHERE DATE(create_time) 2024-01-01优化器无法直接利用索引树可以直接把条件改成范围查询create_time 2024-01-01 AND create_time 2024-01-02。隐式类型转换比如字符串列和数字比较MySQL会把字符串转数字导致索引列上发生隐式函数操作而失效。左模糊查询LIKE %abc无法走索引因为B树只能按前缀匹配。OR连接非索引列导致全表扫描可以用UNION ALL拆开。联合索引不满足最左前缀。优化器判断全表扫描比走索引更快比如区分度极低的性别字段这时候索引是“失效”的但实际上可能是最优选择。这最后一条很多人不知道其实特别能体现水平索引不是建得越多越好也不是一定走了索引就快要基于区分度和实际数据分布判断。3.4 Explain与慢查询日志把性能调优聊成实战故事“mysql性能调优”这个热搜词对应的面试题常常是你有没有处理过慢SQL。回答套路可以固定成三步开启慢查询日志定位问题、用EXPLAIN看执行计划、针对全表扫描的SQL优化索引或改写。慢查询日志开启方法SET GLOBAL slow_query_log ON; SET GLOBAL long_query_time 1; SHOW VARIABLES LIKE slow_query_log%;EXPLAIN要看几个关键列我列个常用表格列名关注点type从好到差system const eq_ref ref range index ALL看到ALL要警觉key实际用到的索引若为NULL则没有用索引rows预估扫描行数越小越好ExtraUsing filesort、Using temporary 都说明需要优化其中Using filesort是经典考点面试官会问“为什么排序会慢”。这是因为SQL里ORDER BY没走索引MySQL需要把结果集先读出来再用排序缓冲区做排序。回答出“让排序字段加入索引使B树天然有序MySQL直接按索引序读取”这个解法即可。讲性能调优题的时候建议绑一个自己的真实案例哪怕是测试环境遇到的都行。比如某查询WHERE status0 ORDER BY create_time DESC LIMIT 20在数据量到百万级后变慢EXPLAIN看type是ALL、Extra是Using filesort解决方式是建联合索引(status, create_time)既过滤了状态又让排序走索引。这种“问题—定位—解决—验证”的讲法才是面试官想听的。4. 主从复制与数据同步从一道“同步表到本地”的题谈起4.1 主从复制的三层递进问题架构题里出现频率最高的是主从复制。常见问法主从复制原理是什么MySQL怎么保证主备数据一致延迟了怎么处理这道题自己先分层回答才不混乱。第一层是流程主库提交事务后写入binlog从库的I/O线程拉取binlog写到自己的relay log中继日志从库的SQL线程再重放relay log。MySQL 8.0默认binlog格式是ROW相比 STATEMENT 格式ROW更安全不会因为SQL上下文不同导致主从执行结果不一致代价是binlog体积变大。第二层是复制方式演进传统异步复制主库提交成功就算完事从库可能有延迟甚至丢数据半同步复制Semisynchronous Replication要求至少一个从库确认收到binlog后主库才提交MySQL Group ReplicationMGR基于Paxos协议属于更进阶的高可用方案。面试答到半同步基本就说明你有生产意识了。第三层是复制延迟排查大事务一次更新几十万行、DDL操作、从库硬件弱、单线程SQL线程限制都可能导致延迟。优化方向是开启并行复制MTS、拆大事务、升级从库配置。4.2 把远程库的这张表同步到本地生产题的标准答法有一个热搜词非常适合用来考察真实解决问题的能力“把远程库的这张表同步到本地”。这其实是一个典型的数据同步需求面试官出这种题是想看你会不会先问“场景约束”再给方案。第一步永远是确认约束这张表多大需要实时同步还是准实时目标表在本地已存在且结构一致吗是一次性迁移还是持续同步不同的答案对应不同方案。如果是一次性同步最稳妥的是逻辑备份# 远程库导出单表 mysqldump -h remote_host -P 3306 -u user -p database_name table_name table.sql # 本地导入 mysql -h localhost -u user -p database_name table.sql如果表很大加--single-transaction保证导出期间不锁表前提是引擎是InnoDB--set-gtid-purgedOFF在不是主从环境导入时能避免GTID冲突。如果是持续同步那思路就要转向主从复制或者数据订阅中间件。先看远程库有没有开binlogSHOW VARIABLES LIKE log_bin; SHOW MASTER STATUS;如果binlog开启了可以在本地库配置主从复制5.7及以上优先用GTID模式。大致步骤# 本地库配置 CHANGE MASTER TO MASTER_HOSTremote_host, MASTER_USERrepl, MASTER_PASSWORDpassword, MASTER_AUTO_POSITION1; START SLAVE; SHOW SLAVE STATUS\G注意检查Slave_IO_Running和Slave_SQL_Running都是YES。这种基于binlog的复制是数据库引擎级同步实时性和一致性最好但也有成本远程库需要开启binlog并创建复制账号本地表结构要一致且这种同步是全库或部分库级别的只同步单表需要通过replicate-do-table参数限定。如果不想碰主从配置可以用DataX、Flink CDC这类数据同步工具它们本质上是订阅binlog解析成SQL或数据流再写入目标。答方案的时候带一句“真正到生产环境还要考虑断点续传和幂等写入”这就显示出你不是只会跑命令。4.3 高可用思路半同步与GTID把上面的题接下去面试官很可能顺口问“你们主从挂了怎么办”——这就进入了高可用范畴。半同步和GTID是绕不开的两个点。GTID最大的价值是把“从哪个binlog文件哪个位置开始复制”这种偏移量定位变成了“上次执行到哪个全局事务ID”主从切换或重新搭建时不需要手工找POS点子节点连上来后自动找同步点。回答时可以背一条命令集SHOW MASTER STATUS看到的只有GTID集合CHANGE MASTER TO MASTER_AUTO_POSITION1配好之后看RETRIEVED_GTSET和EXECUTED_GTSET有没有追平。半同步复制则要说出它的取舍它降低了主库写入延迟的容忍度因为主库必须等从库ACK但在一个机房内网络延迟通常可接受换来的是故障切换时几乎不丢数据。注意MySQL 5.7引入了lossless半同步ACK确认在引擎提交前完成能真正做到“无损”。5. 存储过程、触发器与常用函数看似基础却最容易翻车的点5.1 存储过程DELIMITER与异常处理存储过程在业务开发里用得少了但面试还经常问为什么因为它考察程序流程控制、异常处理和安全性而且能看出你有没有在真实项目里写过脚本。最简单的考点是DELIMITER。MySQL客户端的语句分隔符是分号但存储过程体内部也有分号如果你不先把分隔符改掉客户端会在第一个分号处就截断语句。所以标准写法DELIMITER // CREATE PROCEDURE sp_test() BEGIN SELECT 1; END// DELIMITER ;第二考点是异常处理很多人写存储过程从来不处理异常面试官一问就露馅。用DECLARE ... HANDLER捕获异常DELIMITER // CREATE PROCEDURE sp_insert_order( IN p_user_id INT, IN p_amount DECIMAL(10,2) ) BEGIN DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN ROLLBACK; SELECT transaction rollback AS msg; END; START TRANSACTION; INSERT INTO orders(user_id, amount) VALUES(p_user_id, p_amount); UPDATE users SET balance balance - p_amount WHERE id p_user_id; COMMIT; END// DELIMITER ;能说出DECLARE EXIT HANDLER FOR SQLEXCEPTION然后ROLLBACK这道题你就掌握了主动权。还可以补充一句“存储过程的问题在于难以调试版本管理也不方便所以现在业务逻辑不推荐放数据库但在批量数据处理、报表统计场景里依然有它不可替代的价值。”5.2 触发器NEW与OLD的边界触发器考察点集中在两个新旧数据的访问以及触发器的副作用。在INSERT触发器里只有NEWDELETE触发器里只有OLDUPDATE触发器里两者都有。NEW.字段表示新值OLD.字段表示旧值。一个标准的审计表触发器CREATE TRIGGER trg_order_audit AFTER UPDATE ON orders FOR EACH ROW BEGIN INSERT INTO orders_log(order_id, old_status, new_status, changed_at) VALUES (OLD.id, OLD.status, NEW.status, NOW()); END;第二层问题是“触发器有什么缺点”。多数人答不上来面试官其实想听触发器对业务方是透明的出了问题极难排查而且它是逐行触发的FOR EACH ROW在大批量UPDATE时会显著拖慢性能触发器里如果再写了跨表操作容易引发嵌套触发甚至死锁。所以现在主流做法是尽量不用触发器审计逻辑放到应用程序里。5.3 常用函数与日期转换别在基础题上丢分热搜词“mysql将字符串转为日期”“mysql常用函数”对应的面试题通常是笔试里的SQL题。日期函数是重灾区我建议把几个高频组合记熟-- 字符串转日期 SELECT STR_TO_DATE(2024-05-01, %Y-%m-%d); -- 日期转字符串 SELECT DATE_FORMAT(NOW(), %Y-%m-%d %H:%i:%s); -- 日期计算 SELECT DATE_ADD(NOW(), INTERVAL 7 DAY); SELECT DATEDIFF(2024-05-10, 2024-05-01);特别注意STR_TO_DATE的格式符大小写%Y是四位年%y是两位年%i是分钟%m是月份写错直接返回NULL。用CAST(2024-05-01 AS DATE)也行但不能处理带格式的字符串。面试时能把STR_TO_DATE和DATE_FORMAT成对讲出来区分字符串化和日期化方向基础题就没问题了。字符串函数里高频的有CONCAT拼接、SUBSTRING_INDEX按分隔符截取、GROUP_CONCAT把一列多行合并成逗号串。聚合函数里容易被问的是COUNT(*)和COUNT(col)的区别前者统计行数后者统计该列非NULL的行数这个细节在很多SQL题里都是坑。5.4 三个隐蔽考点int5、默认值0、排序规则热搜词里的“mysql中int5”“mysql设置默认值为0”“mysql排序”看起来像操作问题但面试题非常爱拿这种细节埋伏笔。int5的坑在前文提过INT(5)的5是显示宽度不是能存5位数的意思。INT类型固定4字节能存范围是-2147483648到2147483647显示宽度只在配合ZEROFILL时才有视觉意义MySQL 8.0.19已废弃显示宽度语法。如果面试官问INT(5)能存多大的数直接答“和INT完全一样5只是显示位宽”。默认值为0的坑涉及SQL_MODE。严格模式下不允许DEFAULT 0出现在时间类型字段上不完全准确准确说是时间类型默认值一般建议用CURRENT_TIMESTAMP而DEFAULT 0在含有NO_ZERO_DATE模式时会被拒绝或者出现Invalid default value报错。对于数值类型字段设默认0正常情况下没有问题。做题时不要看到默认值就慌先判断字段类型再判断SQL_MODE。排序的坑主要在字符集中文排序默认按utf8/utf8mb4的编码顺序排不是拼音顺序。如果需要按拼音排序可以ORDER BY CONVERT(name USING gbk)使用GBK编码排序实现拼音序。还有个高频隐藏点ORDER BY某个带索引的字段如果前面还有WHERE条件里用了非索引列很容易触发Using filesort这又能和第三章的索引优化串起来。6. 连接池、安装排错与工具生态综合题的应对策略6.1 连接池从配置参数讲到“too many connections”热搜词里有“mysql的数据库连接池”对应面试题一般是“为什么需要连接池连接池参数怎么配置遇到too many connections怎么处理”连接池存在的根本原因服务端每次建立MySQL连接都要经过TCP握手、认证、分配资源成本很高连接池复用连接能显著降低延迟和资源开销。答案里最好带上具体参数比如// HikariCP 常见配置 spring.datasource.hikari.maximum-pool-size20 spring.datasource.hikari.minimum-idle5 spring.datasource.hikari.connection-timeout30000连接池大小不是越大越好很多资料都会提到PostgreSQL作者的一个经验公式连接数 ((核心数 * 2) 有效磁盘数)超过这个值后线程上下文切换成本会超过并行收益。MySQL的max_connections默认100或151生产一般调大但无脑调到几千会导致数据库内存被大量线程栈吃光。“too many connections”的标准排查顺序SHOW STATUS LIKE Threads_connected;看当前连接数。SHOW VARIABLES LIKE max_connections;看上限。SHOW PROCESSLIST;看连接都在干什么是否存在大量Sleep连接。优化方向调大max_connections、缩小wait_timeout让空闲连接早断、提高连接池复用率、查慢SQL降低单个连接持有时间。如果在面试时能说出“有些连接Sleep是因为应用层没有正确归还连接而不是数据库问题”这道题你基本就可以自己主导节奏了。6.2 安装与启动失败排查热线词就是考题范本把安装类热搜词放在一起看你会发现它们几乎都是故障排查题mysql ssl连接错误、error 2002、centos查看mysql初始密码、rpm安装mysql、docker安装mysql失败。error 2002 (HY000): Cant connect to local MySQL server through socket /tmp/mysql.sock这道题的标准排查链路是先确认MySQL进程是否活着ps -ef | grep mysqld没起来先看错误日志。如果进程活着再看socket路径是否一致客户端默认找/tmp/mysql.sock但服务端配置里可能写的是/var/run/mysqld/mysqld.sock加-S /var/run/mysqld/mysqld.sock或者用TCP方式-h 127.0.0.1 -P 3306连接。检查目录权限socket文件所属用户必须是启动MySQL的用户否则其他用户无法访问。Windows下同样问题往往表现为端口连不上要查bind-address和防火墙。SSL连接错误的热搜词也值得准备一句如果客户端报SSL connection error先看服务端SHOW VARIABLES LIKE have_ssl是否ON再确认客户端连接参数是否带--ssl-modeDISABLED绕过或者在配置里设skip_ssl。生产环境建议保留SSL但很多内网测试环境为了省事确实会关掉这个操作本身不复杂面试主要是看你思路清不清楚。还有CentOS下查看MySQL初始密码RPM或yum安装的MySQL初始临时密码在/var/log/mysqld.log里grep temporary password /var/log/mysqld.log拿到后用ALTER USER rootlocalhost IDENTIFIED BY NewPassword;修改。这类细节题答上来能给面试官一个“这个人真的动手部署过”的信号。Docker安装MySQL失败常见原因则是版本标签写错、端口映射冲突、容器目录挂载权限以及MYSQL_ROOT_PASSWORD和MYSQL_DATABASE环境变量在已有数据目录时不生效——这些都可以放到“部署经验”里聊证明你不是只会跑默认命令。6.3 工具与生态Navicat之外的工程素养题热搜词里“navicat for mysql 破解安装”热度一直很高这里必须提醒一句破解版软件风险极大不建议在任何环境使用更不要写进简历。Navicat官方提供14天试用如果只是学习和面试准备完全够用。想要开源免费方案DBeaver Community是更好的选择支持MySQL全系版本还能通过“数据库驱动管理”离线添加驱动jar包适合内网环境。给一个离线添加驱动的大致思路官网下载对应mysql-connector-j-x.x.x.jar打开DBeaver的“数据库驱动管理器”新建驱动填入类名com.mysql.cj.jdbc.Driver添加刚才的jar包保存即可。还有一个比较特别的搜索词“mysql表结构自动转tdengine超级表子表”。如果你面试面到物联网/时序数据方向很可能会被问到。TDengine不是关系型数据库它的模型是超级表STable子表SubTable超级表定义schema子表通过标签TAG区分设备每张子表是一组时序数据。把MySQL业务表迁到TDengine建模思路和关系型完全不同主键不再是自增ID而是时间戳加设备标识普通业务字段里属于不断变化的值列放列FIELD不变的设备属性放标签TAG。面试问这种跨领域问题不是为了让你现场写转换脚本而是看你能不能快速理解场景并给出建模思路。技术社区里“mysql命令大全”这类词也很热我的建议是不要背命令大全而是背“命令组织逻辑”管理命令SHOW、DESCRIBE、EXPLAIN、DML命令SELECT、INSERT、UPDATE、DELETE、DDL命令CREATE、ALTER、DROP、权限命令GRANT、REVOKE、事务命令START TRANSACTION、COMMIT、ROLLBACK、备份命令mysqldump、binlog。把每种命令对应到一个实际场景比零散背几十条命令有效得多。最后说一点面试之外的体会。我面过不少候选人背题和真会的人在问答里差别非常明显背题的人只给结论被追问一次就卡壳真会的人会自己讲出“我是怎么遇到这个问题的、当时查了哪些日志、最后怎么定位到根因”。所以如果你还有时间别只刷题在一台自己的MySQL上把报错复现一遍、把主从复制搭一遍、把慢查询优化一轮这些动作带来的提升远超过把几百道面试题背完。面试题会忘但动手排查积累的感觉不会丢。