尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

MySQL面试核心35问:从InnoDB到性能调优全解析

MySQL面试核心35问:从InnoDB到性能调优全解析 1. 为什么MySQL面试题总让人又爱又恨每次跳槽季来临MySQL相关的面试题就像老朋友一样准时出现。作为关系型数据库的扛把子MySQL在面试中的出场率居高不下。但奇怪的是明明日常工作中经常使用面对面试官的连环追问时很多人还是会手心冒汗。我经历过三次大厂面试轮回整理过上千道MySQL真题发现面试官最爱问的其实就集中在35个核心知识点上。这些题目就像武侠小说里的八股文有固定的套路和变招。掌握它们相当于拿到了数据库领域的九阴真经。2. MySQL面试的四大核心战场2.1 存储引擎InnoDB的七十二变InnoDB绝对是面试中的明星选手。去年面蚂蚁时技术VP花了20分钟就盯着InnoDB问B树索引的底层实现叶子节点如何保持有序为什么选择B树而不是红黑树一次索引查找要经历几次IO实测案例在500万数据的用户表上SELECT * FROM users WHERE id123456这条查询InnoDB实际只用了1次磁盘IO就找到了数据。这是因为...事务隔离级别的实现MVCC机制如何避免幻读undo log在RR级别下的特殊处理。亲手演示过在并发事务中两个隔离级别下查询结果的差异-- 事务A BEGIN; SELECT * FROM accounts WHERE balance 1000; -- 看到3条记录 -- 事务B同时插入新数据并提交 -- 在RR级别下再次查询仍为3条RC级别下会看到4条缓冲池管理最近帮团队调优时发现当innodb_buffer_pool_size设置为物理内存的70%时查询性能提升了3倍。但要注意...避坑指南千万别说MyISAM适合读多写少现在99%的场景都用InnoDB。上次面试有个候选人这么说直接被面试官怼你还在用MySQL5.5吗2.2 索引优化从B树到最左前缀头条的面试官曾让我在白板上手写索引匹配规则。核心要点索引失效的六大场景在状态字段上使用NOT IN导致全表扫描对手机号字段使用LEFT(phone,3)138函数操作类型隐式转换WHERE user_id123user_id是int联合索引的排列组合ALTER TABLE orders ADD INDEX idx_composite(status, create_time, user_id);这个索引能加速哪些查询实测结果✅WHERE status1 AND create_time2023-01-01✅WHERE status1 ORDER BY create_time❌WHERE create_time2023-01-01跳过了最左列索引选择性的计算SELECT COUNT(DISTINCT gender)/COUNT(*) AS selectivity FROM users;结果0.0002说明不适合建索引。而user_name字段的选择性达到0.93是理想索引候选。2.3 事务与锁并发的艺术美团二面时考官给出这样一个场景-- 事务1 BEGIN; UPDATE accounts SET balancebalance-100 WHERE user_id1; -- 事务2 BEGIN; UPDATE accounts SET balancebalance100 WHERE user_id2; UPDATE accounts SET balancebalance-50 WHERE user_id1; -- 会发生什么必须掌握的锁机制行锁升级表锁的条件当更新条件无索引时InnoDB会直接锁表。上周就遇到一个UPDATE payments SET status1 WHERE order_id LIKE 2023%把整个库拖垮的案例。死锁的产生与排查SHOW ENGINE INNODB STATUS\G查看LATEST DETECTED DEADLOCK段会显示事务等待的资源关系图。间隙锁(Gap Lock)的触发场景在RR级别下SELECT * FROM users WHERE age BETWEEN 20 AND 30 FOR UPDATE会锁住20-30岁之间的所有空隙即使这些记录还不存在。2.4 性能调优从EXPLAIN到慢查询阿里P9曾让我现场分析一个慢查询SELECT u.*, o.order_count FROM users u LEFT JOIN ( SELECT user_id, COUNT(*) AS order_count FROM orders GROUP BY user_id ) o ON u.ido.user_id WHERE u.register_time2023-01-01;优化路线图EXPLAIN关键指标type列出现ALL就是全表扫描红色警报Extra列出现Using filesort说明有性能杀手慢查询日志分析技巧# my.cnf配置 slow_query_log1 long_query_time0.5 log_queries_not_using_indexes1用pt-query-digest工具分析时要特别关注Rows_examined与Rows_sent的比值。连接池参数优化SHOW STATUS LIKE Threads_connected;如果这个值经常接近max_connections默认151就需要调整。但要注意...3. 高频灵魂拷问TOP10根据最近半年面试统计这些题目的出现频率高得吓人说下MySQL的架构分层查询语句的执行流程要能画出从连接器→分析器→优化器→执行器→存储引擎的完整流程图重点说明优化器如何选择索引redo log和binlog的区别是什么两阶段提交解决什么问题对比两者的写入时机、内容格式、崩溃恢复作用画图说明为什么需要两阶段提交线上发现CPU100%如何定位是否是MySQL问题诊断步骤top -H -p pgrep mysqld perf top -p pgrep mysqld SHOW PROCESSLIST;主从延迟怎么解决5种方案对比降低并行事务大小使用MGR集群配置semi-sync复制业务层做读写分离监控Seconds_Behind_Master指标varchar(255)和varchar(256)有区别吗从存储字节数、索引限制、行溢出等方面分析实际测试结果在utf8mb4下两者实际存储开销可能相同大表DDL有哪些方案pt-online-schema-change原理图解gh-ost工具的cut-over机制阿里云DMS的无锁变更实践为什么推荐用自增主键对比UUID、雪花ID的插入性能差异页分裂问题的重现实验CREATE TABLE test_pk ( random_pk VARCHAR(32) PRIMARY KEY, data VARCHAR(100) ) ENGINEInnoDB;count(*)为什么比count(1)慢在MyISAM和InnoDB引擎下的不同表现实测结果在InnoDB下两者性能差异1%JOIN和子查询如何选择用EXPLAIN对比两种写法的执行计划特殊情况当子查询结果集很小时...分库分表后ID怎么生成对比数据库号段、雪花算法、Redis原子操作的优劣美团Leaf方案的架构设计4. 面试实战技巧4.1 回答框架STAR法则升级版在腾讯面试时我用这个结构回答如何优化慢查询Situation线上订单查询超时平均响应2.8秒Task要求1秒内响应QPS峰值500Action用pt-index-usage分析索引使用率重构为SELECT * FROM orders FORCE INDEX(idx_user) WHERE user_id?引入ES做查询分流ResultP99降至800ms节省了3台服务器4.2 白板题解题思路遇到设计Twitter的关注关系数据库这类题先明确核心实体用户、推文、关注关系画ER图标注基数关系1:n, m:n重点讨论关注关系的实现方案-- 方案1邻接表 CREATE TABLE follows ( follower_id BIGINT, followee_id BIGINT, PRIMARY KEY (follower_id, followee_id) ); -- 方案2闭包表适合多层关系查询 CREATE TABLE path ( ancestor BIGINT, descendant BIGINT, depth INT );4.3 反问面试官的技巧好的问题让面试加分咱们团队遇到的最棘手的MySQL问题是现在的分库分表方案是基于什么考虑选择的您觉得MySQL8.0最实用的新特性是5. 学习路线与资源推荐5.1 知识图谱构建我整理的MySQL知识脑图包含基础篇数据类型、运算符、常用函数架构篇连接池、查询缓存注意8.0已移除进阶篇XA事务、GIS数据处理、窗口函数生态篇Canal监听binlog、ShardingSphere分片5.2 实验环境搭建推荐用Docker快速构建主从集群# 主库 docker run -d -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD123456 \ mysql:8.0 --server-id1 --log-binmysql-bin # 从库 docker run -d -p 3307:3306 \ -e MYSQL_ROOT_PASSWORD123456 \ mysql:8.0 --server-id25.3 经典书籍批注《高性能MySQL》必看章节第5章 创建高性能索引索引合并算法第6章 查询性能优化避免重复查询第7章 MySQL高级特性GIS空间索引《MySQL技术内幕》重点看InnoDB事务实现细节缓冲池的LRU算法变种双写缓冲区工作原理6. 避坑指南我踩过的雷字符集陷阱曾经因为utf8和utf8mb4混用导致emoji存储失败。现在一律推荐[mysqld] character-set-serverutf8mb4 collation-serverutf8mb4_unicode_ci隐式提交ALTER TABLE会隐式提交事务导致事务原子性破坏。解决方案是...连接池配置wait_timeout和interactive_timeout设置不当会导致连接泄漏。建议配合应用层连接池的...备份恢复用mysqldump时一定要加--single-transaction参数否则锁表风险极大。去年我们有个7TB的库因此瘫痪2小时。版本升级从5.7升到8.0时group by的语义变化导致报表错误。必须测试的兼容点包括...7. 面试后的持续精进通过面试只是起点建议建立自己的知识库遇到问题就记录解决方案定期复盘线上事故参与MySQL社区讨论关注官方博客和Release Notes最近在研究MySQL8.0的直方图统计功能发现对不均匀数据分布的查询优化效果显著ANALYZE TABLE orders UPDATE HISTOGRAM ON amount WITH 100 BUCKETS;真正的数据库高手不是背题背出来的而是在解决一个个真实问题的过程中成长起来的。每次面试都应该是一次技术交流的机会而不是简单的问答考验。
返回列表