Database_MySQL 面试专题手册
💡 本章节共收录 5163 道面试真题,建议每天复习 10-20 题。
Q1: MySQL的隔离级别有哪些?一般使用哪种?可重复读可能带来什么风险?
【核心解析】 隔离级别:读未提交、读已提交、可重复读、串行化;一般使用可重复读(InnoDB默认);可重复读可能产生幻读(通过MVCC和间隙锁解决),以及间隙锁导致的死锁风险。
Q2: 场景题:一亿条数据怎么快速插入MySQL?
【核心解析】 批量插入(如每批1000条);使用LOAD DATA INFILE;关闭自动提交和唯一性检查;调整innodb_flush_log_at_trx_commit;使用预编译语句;分库分表
Q3: 拷打项目:死锁检测、MVCC、优化器实现、为什么使用B+树、隔离级别的实现、MySQL内存模型、MySQL日志、SQL调优
【核心解析】 死锁检测:等待图;MVCC:undo log和ReadView;优化器:基于成本的执行计划选择;B+树:多路平衡,磁盘IO少;隔离级别:读未提交、读已提交、可重复读、串行化;内存模型:Buffer Pool、Change Buffer、Adaptive Hash Index;日志:binlog、redo log、undo log;SQL调优:索引、慢查询、explain
Q4: 如何使用MySQL实现分布式锁?
【核心解析】 基于唯一索引:insert into lock_table(lock_name) values('lock');释放时delete;缺点:单点、死锁;优化:使用for update行锁;或使用乐观锁版本号
Q5: 解释SQL中SELECT语句的基本结构,并举例如何使用。
【核心解析】 基本结构:SELECT 列名 FROM 表名 WHERE 条件 GROUP BY 分组 HAVING 过滤 ORDER BY 排序 LIMIT 限制;例如:SELECT name, age FROM users WHERE age > 18 ORDER BY age DESC LIMIT 10。
Q6: MySQL的ACID特性是如何保证的?
【核心解析】 原子性:通过undo log实现,事务回滚时撤销已执行操作;一致性:通过约束、触发器、应用逻辑保证,数据库自动维护;隔离性:通过锁机制和MVCC实现,提供四种隔离级别;持久性:通过redo log实现,事务提交后写入redo log并落盘。
Q7: 联合索引的创建顺序如何影响查询性能?请举例说明如何调优。
【核心解析】 联合索引遵循最左前缀原则,查询条件需从索引最左列开始;调优时可调整列顺序以匹配高频查询条件;例如索引(a,b,c)可优化where a=? and b=?,但where b=?无法使用;工程上应分析查询模式,将选择性高的列放在前面;也可考虑冗余索引或覆盖索引。
Q8: SQL中索引的常用数据结构有哪些?各自优缺点是什么?
【核心解析】 B+树:MySQL InnoDB默认,支持范围查询,高度平衡;哈希索引:等值查询快,不支持范围查询;全文索引:用于文本搜索;R树:用于空间数据;B+树适合磁盘IO,哈希适合内存。
Q9: MySQL 索引下推(Index Condition Pushdown)的原理是什么?它如何优化查询性能?请举例说明。
【核心解析】 索引下推是 MySQL 5.6 引入的优化,将部分 WHERE 条件从服务层下推到存储引擎层,减少回表次数;原理:存储引擎在遍历索引时,直接对索引列进行过滤,只将符合条件的记录返回给服务层;适用场景:联合索引中,查询条件包含索引列的非最左前缀部分;示例:表 t(a,b,c) 联合索引 (a,b),查询 WHERE a>1 AND b=2,无索引下推时需回表后过滤 b=2,有索引下推时在索引遍历时直接过滤 b=2;优势:减少 IO 和 CPU 开销,提升查询效率;限制:仅适用于二级索引,且条件必须涉及索引列。
Q10: Redis和MySQL的数据一致性怎么保证?分布式锁加锁的时机是什么?
【核心解析】 采用先更新数据库再删除缓存策略;使用分布式锁保证并发操作顺序;加锁时机:更新数据库前获取锁,操作完成后释放;结合消息队列异步重试
Q11: MySQL事务的四大特性是什么?
【核心解析】 原子性(Atomicity):事务中的所有操作要么全部成功,要么全部失败回滚;一致性(Consistency):事务执行前后数据保持一致状态;隔离性(Isolation):并发事务之间相互隔离,避免数据不一致;持久性(Durability):事务提交后对数据的修改是永久的。
Q12: MySQL B+树底层存储结构是什么样的?
【核心解析】 B+树是一种平衡多路搜索树;所有数据存储在叶子节点,非叶子节点只存索引;叶子节点形成有序链表,支持范围查询;高度通常为2-4层,减少磁盘IO。
Q13: 聚簇索引和二级索引有什么区别?
【核心解析】 聚簇索引:数据行与索引存储在一起,叶子节点包含完整行数据;每个表只能有一个;二级索引:叶子节点存储主键值,查询需要回表;非聚簇索引可建多个。
Q14: ShardingJDBC底层是怎么实现分库分表的?
【核心解析】 通过解析SQL,根据分片键和分片策略路由到目标数据源;使用SQL重写、结果归并;支持多种分片算法(取模、哈希、范围等);对应用透明。
Q15: 在什么情况下需要做分库分表,拆表后关联查询的效率如何保证?
【核心解析】 当单表数据量过大(如千万级)导致性能下降时;分库分表后关联查询尽量在应用层做,或使用全局表、ER分片;避免跨库join,通过冗余字段或多次查询。
Q16: 如果不用Redis,直接在MySQL层面避免高并发下的重复点赞,怎么设计?
【核心解析】 唯一索引(用户ID+目标ID);INSERT ... ON DUPLICATE KEY UPDATE;事务+行锁;乐观锁(版本号);先查后写但需加锁;异步批量合并;使用数据库的原子操作如UPDATE SET count=count+1
Q17: MySQL索引有哪些分类?主键索引和唯一索引有什么区别?
【核心解析】 索引分类:主键索引、唯一索引、普通索引、全文索引;按个数分单列索引和复合索引;主键索引是聚簇索引,唯一索引是非聚簇索引;主键索引不允许空值,唯一索引允许空值;主键索引一个表只能有一个,唯一索引可以有多个。
Q18: MySQL索引下推
【核心解析】 索引下推(ICP)是MySQL 5.6引入的优化,将部分WHERE条件下推到存储引擎层过滤;减少回表次数,提高查询效率;适用于InnoDB和MyISAM的二级索引;通过EXPLAIN查看Extra列是否显示Using index condition;ICP不能用于主键索引、覆盖索引或包含子查询的条件。
Q19: 分库分表是怎么做的?以什么维度进行切分的?这样会不会有热点问题?
【核心解析】 分库分表策略:垂直分库(按业务模块)、水平分库(按数据分片);切分维度:用户ID、订单ID、时间等;热点问题:某些分片数据访问频繁导致负载不均;解决方案:使用一致性哈希、动态调整分片、读写分离、缓存热点数据。
Q20: UUID可以作为MySQL的主键吗?有什么问题?
【核心解析】 UUID无序,导致B+树索引频繁分裂;占用空间大(36字节);查询性能差;建议使用自增ID或雪花算法;可以考虑UUID的变种如有序UUID。
Q21: SQL优化有哪些常见手段?
【核心解析】 合理使用索引;避免SELECT *;使用EXPLAIN分析执行计划;优化查询条件(避免函数操作、隐式转换);分页优化;读写分离、分库分表。
Q22: 为什么MySQL使用B+树作为索引结构?联合索引如何使用?
【核心解析】 B+树特点:多路平衡树,非叶子节点只存键,叶子节点存数据并形成有序链表,适合范围查询和排序;联合索引遵循最左前缀原则,查询时从最左列开始匹配,跳过中间列会导致索引失效。
Q23: MySQL事务的四个隔离级别分别是什么?它们分别解决了哪些问题?
【核心解析】 读未提交(READ UNCOMMITTED):允许脏读,即读到其他事务未提交的数据;读已提交(READ COMMITTED):避免脏读,但可能出现不可重复读(同一事务内两次读取结果不同);可重复读(REPEATABLE READ):避免脏读和不可重复读,但可能出现幻读(同一条件两次查询结果集不同),MySQL InnoDB通过MVCC和间隙锁解决幻读;串行化(SERIALIZABLE):最高隔离级别,强制事务串行执行,避免所有并发问题,但性能最低。
Q24: InnoDB 默认的存储引擎是什么?请说明其特点。
【核心解析】 InnoDB 是 MySQL 默认的存储引擎;支持事务、行级锁、外键;使用聚簇索引组织数据;支持 MVCC 实现高并发;具有崩溃恢复能力。
Q25: MySQL的事务隔离级别有哪些?读已提交和可重复读的区别是什么?MySQL默认隔离级别是什么?
【核心解析】 隔离级别:读未提交、读已提交、可重复读、串行化;读已提交允许不可重复读,可重复读通过MVCC避免;MySQL默认隔离级别是可重复读。
Q26: B+树是什么?为什么MySQL索引用B+树?B+树和二叉树的区别?
【核心解析】 B+树是多路平衡搜索树,所有数据在叶子节点,非叶子节点只存键;适合磁盘IO,范围查询高效;二叉树深度大,磁盘IO次数多。
Q27: 数据库选择题:索引、SQL语句、事务隔离级别。
【核心解析】 索引类型:B+树、哈希;SQL语句:DML、DDL;隔离级别:读未提交、读已提交、可重复读、串行化。
Q28: 数据库的索引是什么?索引为什么用B+树实现?索引失效的场景有哪些?
【核心解析】 索引是加速查询的数据结构;B+树适合磁盘IO,范围查询高效;索引失效:模糊查询以%开头、使用函数、类型转换等。
Q29: B树和B+树的区别是什么?
【核心解析】 B+树所有数据存储在叶子节点,非叶子节点只存索引;B树所有节点都存数据;B+树叶子节点形成链表,适合范围查询;B+树查询效率更稳定,通常为O(log n);B+树更适合磁盘I/O,节点大小与页对齐。
Q30: SQL语句性能问题如何排查优化?
【核心解析】 使用EXPLAIN分析执行计划;检查索引使用情况;优化查询条件避免全表扫描;减少JOIN和子查询;使用慢查询日志;调整数据库参数。
Q31: MySQL什么情况下会锁表?
【核心解析】 MyISAM引擎默认表锁;InnoDB使用行锁但某些情况会升级为表锁(如无索引更新);DDL操作;LOCK TABLES显式锁表;全表扫描。
Q32: 场景:一个表,name字段是非唯一索引,有多条name='张三',查询where name='张三',是什么锁?
【核心解析】 InnoDB使用行锁;对匹配的索引记录加锁(临键锁);可能锁住间隙防止幻读;如果索引不唯一,可能锁住多个行。
Q33: 场景:一个表,用户余额进行扣减,只在MySQL层面,如何保证并发安全?
【核心解析】 使用事务和行锁(SELECT ... FOR UPDATE);乐观锁(版本号或CAS);原子更新(UPDATE ... SET balance = balance - amount WHERE balance >= amount);设置隔离级别为可重复读。
Q34: MySQL什么情况下加记录锁?
【核心解析】 使用SELECT ... FOR UPDATE或UPDATE/DELETE时;InnoDB默认行锁;根据索引加锁;无索引时可能锁表;间隙锁防止幻读。
Q35: 定时任务要做分库分表么,分库分表怎么做的,分库分表有什么缺陷,怎么优化?
【核心解析】 数据量大时需分库分表;按ID或时间分片;缺陷:跨库查询、分布式事务、扩容复杂;优化:使用中间件(ShardingSphere)、合理分片、读写分离。
Q36: 请解释MySQL索引下推(Index Condition Pushdown)的原理及其优化效果。
【核心解析】 索引下推:将部分WHERE条件下推到存储引擎层过滤,减少回表次数;适用于InnoDB和MyISAM;减少IO和CPU开销;示例:联合索引(a,b),查询a>1 AND b=2,下推后b条件在索引层过滤。
Q37: 当收到慢查询告警后,应如何处理?请列出排查和优化的步骤。
【核心解析】 开启慢查询日志;使用EXPLAIN分析执行计划;检查索引使用情况;优化SQL语句;考虑分库分表或缓存。
Q38: Elasticsearch中如何实现模糊查询?text和keyword类型、match和term查询的区别是什么?
【核心解析】 模糊查询可使用match、match_phrase、wildcard、regexp等;text类型会分词,适合全文搜索,使用match;keyword类型不分词,适合精确匹配、排序、聚合,使用term;模糊查询如wildcard和regexp对keyword字段性能较差;建议根据查询需求选择字段类型和查询方式。
Q39: MySQL的事务隔离级别有哪些?
【核心解析】 读未提交、读已提交、可重复读、串行化;MySQL默认是可重复读;隔离级别越高,并发性能越低
Q40: 什么是MVCC?MySQL如何实现MVCC?
【核心解析】 MVCC是多版本并发控制,用于实现非锁定读;通过隐藏字段(DB_TRX_ID、DB_ROLL_PTR)和undo log实现;在可重复读隔离级别下,通过Read View保证一致性
Q41: MySQL索引在什么情况下会失效?
【核心解析】 违反最左前缀法则;使用函数或计算;类型转换;like以通配符开头;or条件中有非索引列;索引列参与运算
Q42: 什么是B+树?MySQL为什么使用B+树作为索引结构?
【核心解析】 B+树是多路平衡查找树,所有数据存储在叶子节点,非叶子节点只存键值;叶子节点形成有序链表;适合范围查询和排序;磁盘IO次数少
Q43: 什么是MySQL慢查询?如何优化?
【核心解析】 慢查询指执行时间超过long_query_time的SQL;通过慢查询日志定位;优化方法包括加索引、改写SQL、分库分表等
Q44: 什么是级联查询?在MySQL中如何实现?
【核心解析】 级联查询指通过外键关联多个表进行查询;使用JOIN实现,如INNER JOIN、LEFT JOIN;注意索引和性能
Q45: 请解释B+树的数据结构特点,以及为什么MySQL InnoDB引擎选择B+树作为索引结构。
【核心解析】 B+树是多叉树,所有数据存储在叶子节点,非叶子节点只存索引;叶子节点形成有序链表,支持范围查询;节点大小通常为16KB,减少IO次数;树高度低(宽矮),减少磁盘访问;相比哈希表,B+树维护有序性;相比B树,B+树非叶子节点不存数据,IO更少。
Q46: 在生成报表时,如何控制SQL只允许SELECT操作,禁止DDL(如DELETE)?
【核心解析】 数据库层面:创建只读用户,授予SELECT权限;应用层面:SQL白名单、使用ORM框架限制;前端层面:React中禁用危险操作按钮;使用数据库代理或中间件拦截非SELECT语句
Q47: 请介绍MySQL的索引种类及B+树的具体实现,并解释脏读、幻读、不可重复读的区别以及事务隔离级别。
【核心解析】 索引种类包括B+树索引、哈希索引、全文索引等;B+树实现:非叶子节点只存键值,叶子节点存数据且形成有序链表,支持范围查询;脏读:事务读到未提交数据;不可重复读:同一事务两次读取同一数据结果不同;幻读:事务两次查询结果集不同;事务隔离级别:读未提交、读已提交、可重复读、串行化,分别解决不同并发问题。
Q48: MySQL 的事务隔离级别有哪些?不同隔离级别下会出现什么问题?
【核心解析】 四种隔离级别:读未提交、读已提交、可重复读、串行化;读未提交会出现脏读;读已提交会出现不可重复读;可重复读会出现幻读;串行化可避免所有问题但性能低。
Q49: MySQL事务的ACID是什么?请结合项目实际场景说明为什么需要使用事务。
【核心解析】 原子性:事务内操作全部成功或全部回滚;一致性:事务前后数据状态一致;隔离性:并发事务互不干扰;持久性:提交后数据永久保存;项目场景示例:转账操作,需保证扣款和入账同时成功或失败
Q50: 说一下慢查询以及解决方法。
【核心解析】 慢查询指执行时间超过阈值的SQL;通过慢查询日志定位;解决方法:索引优化、SQL重写、分库分表、缓存、数据库参数调优
Q51: 请解释MVCC(多版本并发控制)的原理。
【核心解析】 MVCC通过保存数据快照实现非锁定读;每行记录有隐藏字段(事务ID、回滚指针);读操作根据事务隔离级别判断可见性(Read Committed读最新已提交,Repeatable Read读事务开始时的快照);写操作创建新版本,旧版本保留用于回滚和一致性读
Q52: B+树的结构和特点是什么?
【核心解析】 B+树是平衡多路查找树,所有数据存储在叶子节点;非叶子节点只存储键值索引;叶子节点形成有序链表,支持范围查询;高度低,减少磁盘 I/O;MySQL InnoDB 索引使用 B+树。
Q53: 了解联合索引吗?
【核心解析】 联合索引是多个列组成的索引,遵循最左前缀原则;查询条件必须从最左列开始匹配;可减少索引数量,提高查询效率;索引列顺序影响性能;覆盖索引可避免回表。
Q54: B+树大概是一个什么样的结构?执行一条SELECT语句去查找一条数据,它在B+树里执行的时间复杂度是什么样的?
【核心解析】 B+树是多路平衡查找树,所有数据存储在叶子节点,非叶子节点只存索引;叶子节点形成有序链表,支持范围查询;查找时间复杂度为O(log N),其中N为节点数;实际查询次数等于树的高度。
Q55: MySQL的事务隔离级别有哪些?默认隔离级别是什么?为什么选择可重复读?
【核心解析】 读未提交、读已提交、可重复读、串行化;默认是可重复读;原因:主从复制基于binlog,可重复读级别下binlog记录的是行变更,避免主从不一致;历史原因:早期binlog格式为statement,可重复读能保证复制正确性
Q56: MySQL联合索引中,WHERE A=某值 ORDER BY C 能否走索引?
【核心解析】 取决于联合索引(A,B,C)的B+树结构;WHERE A=某值可定位到A值对应的子树;ORDER BY C需要C有序,但索引中C在B之后,若B未固定则C无序,无法利用索引排序;若B也参与过滤或排序,可能部分利用索引;MySQL可能使用文件排序;可通过EXPLAIN分析执行计划。
Q57: MySQL的InnoDB和MyISAM存储引擎有什么区别?
【核心解析】 InnoDB支持事务、行级锁、外键;MyISAM不支持事务、只支持表级锁;InnoDB使用聚簇索引,MyISAM使用非聚簇索引;InnoDB支持崩溃恢复,MyISAM不支持;InnoDB存储空间更大;MyISAM查询速度更快(读多写少场景)。
Q58: B+树和B树的区别是什么?
【核心解析】 B+树所有数据存储在叶子节点,B树数据存储在内部节点和叶子节点;B+树叶子节点形成链表,支持范围查询;B+树内部节点只存索引,磁盘IO更少;B+树查询效率更稳定(每次到叶子节点);B树查询可能更快(数据在内部节点)。
Q59: MVCC是什么?有了MVCC还需要加锁吗?
【核心解析】 MVCC(多版本并发控制)通过快照读实现非阻塞读;每行记录有隐藏列(事务ID、回滚指针);读操作读取快照版本,写操作创建新版本;MVCC解决读-写冲突,但写-写冲突仍需加锁(如行锁、间隙锁);MVCC用于RC和RR隔离级别。
Q60: MySQL 聚簇索引、覆盖索引、二级索引是否需要回表?
【核心解析】 聚簇索引叶子节点存储整行数据,无需回表;二级索引叶子节点存储主键值,查询非索引列时需要回表;覆盖索引指查询列全部包含在索引中,二级索引也可避免回表;回表次数影响查询性能,可通过索引优化减少回表。
Q61: MySQL的优化方案有哪些?
【核心解析】 合理设计索引;优化SQL语句;使用EXPLAIN分析执行计划;避免全表扫描;合理使用缓存;分库分表;读写分离;调整数据库参数如innodb_buffer_pool_size;定期维护表
Q62: MySQL的隔离级别有哪些?
【核心解析】 读未提交;读已提交;可重复读;串行化;默认隔离级别为可重复读;不同级别解决脏读、不可重复读、幻读问题;实现方式:MVCC和锁
Q63: 乐观锁和悲观锁的具体实现方式是什么?
【核心解析】 悲观锁:使用数据库锁如SELECT ... FOR UPDATE;乐观锁:使用版本号或时间戳;悲观锁适合写多读少;乐观锁适合读多写少;实现时需考虑冲突处理;乐观锁在更新时检查版本号
Q64: 微信支付千亿级别的流水,如何设计数据库索引?
【核心解析】 分库分表;按时间或用户ID分片;使用覆盖索引;索引字段选择:用户ID、时间、订单号;避免索引过多;考虑使用分布式数据库;定期归档历史数据;使用读写分离
Q65: 数据库慢查询如何排查?Explain查询后的关键字介绍,每个关键字都有哪些值,代表什么含义?
【核心解析】 开启慢查询日志;使用EXPLAIN分析SQL;关键字段:id(执行顺序)、select_type(SIMPLE/PRIMARY/SUBQUERY等)、type(ALL/index/range/ref/eq_ref/const)、possible_keys、key、key_len、rows、Extra(Using index/Using filesort/Using temporary等)
Q66: 你对MySQL的锁有了解吗?展开讲讲。
【核心解析】 锁类型:表锁、行锁、间隙锁、临键锁;行锁基于索引;InnoDB支持行锁和表锁;锁粒度影响并发;死锁检测与处理;MVCC实现非锁定读
Q67: MySQL事务的隔离级别是如何实现的?MVCC是如何工作的?
【核心解析】 事务隔离级别通过锁和MVCC实现;MVCC通过隐藏字段(DB_TRX_ID、DB_ROLL_PTR)和undo log实现;Read Committed和Repeatable Read分别使用不同的快照策略;MVCC用于实现非阻塞读和一致性读。
Q68: 为什么MySQL使用B+树作为索引结构,而不是B树或红黑树?
【核心解析】 B+树非叶子节点不存储数据,可存放更多键值,降低树高;B+树叶子节点形成有序链表,支持范围查询和排序;B+树磁盘IO次数少;红黑树树高较高,不适合磁盘存储。
Q69: 什么是覆盖索引?它有什么好处?
【核心解析】 覆盖索引指查询所需字段全部包含在索引中,无需回表;减少磁盘IO,提高查询效率;可通过Extra列中的Using index判断。
Q70: MySQL中出现慢查询时,如何进行优化?
【核心解析】 使用EXPLAIN分析执行计划;检查索引使用情况,考虑添加或优化索引;避免SELECT *,只查询必要字段;优化SQL语句,减少JOIN和子查询;考虑分库分表或读写分离;调整MySQL配置参数如innodb_buffer_pool_size;定期分析表和优化表。
Q71: Elasticsearch的倒排索引是什么?如何工作?
【核心解析】 倒排索引将文档中的词项映射到包含该词项的文档列表;由词典和倒排列表组成;支持快速全文搜索;通过分词、归一化、排序等步骤构建;查询时先查词典再合并倒排列表。
Q72: InnoDB 的事务是怎么实现的?事务有哪几个特性?
【核心解析】 事务的ACID特性:原子性、一致性、隔离性、持久性;InnoDB通过redo log实现持久性,通过undo log实现原子性和MVCC;隔离性通过锁机制和MVCC实现;事务的实现依赖于日志和锁机制。
Q73: 数据库慢查询怎么排查?
【核心解析】 开启慢查询日志记录执行时间超过阈值的SQL;使用EXPLAIN分析执行计划;检查索引使用情况;优化SQL语句,避免全表扫描;使用性能监控工具如pt-query-digest。
Q74: 为什么不建时间、姓名这样的联合索引?
【核心解析】 联合索引遵循最左前缀原则;如果查询条件不包含最左列,索引无法使用;时间列通常范围查询多,放在前面可能导致索引失效;应根据实际查询模式设计索引顺序。
Q75: 请详细解释MySQL索引的数据结构(如B+树)、索引覆盖的概念,以及联合索引在哪些情况下会失效。
【核心解析】 B+树索引结构特点:非叶子节点只存键值,叶子节点存数据并形成有序链表;索引覆盖指查询所需字段全部包含在索引中,无需回表;联合索引失效场景:最左前缀原则不满足、使用不等号或LIKE通配符开头、对索引列进行函数或类型转换、OR条件中部分列无索引等。
Q76: MySQL的聚簇索引和非聚簇索引有什么区别?
【核心解析】 聚簇索引的叶子节点存储整行数据,一个表只能有一个;非聚簇索引叶子节点存储主键值,需要回表查询;聚簇索引按主键顺序物理存储,非聚簇索引逻辑有序。
Q77: 数据库性能优化有哪些常见方法?
【核心解析】 合理设计索引,避免全表扫描;优化SQL语句,减少回表;使用缓存减轻数据库压力;读写分离、分库分表;定期分析慢查询日志。
Q78: 为什么需要分库分表?分库分表后如何保证数据一致性?Join操作和分布式事务如何处理?
【核心解析】 解决单库性能瓶颈和数据量过大问题;分库分表后Join需在应用层或通过中间件实现;分布式事务可使用TCC、Saga或最终一致性方案。
Q79: MySQL中LIMIT 10 OFFSET 0的优化方法有哪些?
【核心解析】 使用覆盖索引避免回表;记录上次查询的最后ID,用WHERE条件代替OFFSET;延迟关联,先查主键再回表;避免大偏移量。
Q80: 慢查询SQL的排查思路是什么?请描述从发现到优化的完整流程。
【核心解析】 开启慢查询日志;使用EXPLAIN分析执行计划;关注索引使用、全表扫描、临时表等;优化SQL语句或添加索引;使用性能监控工具定位。
Q81: 2k QPS下MySQL可以抗住,为什么还要加二级缓存?
【核心解析】 减少数据库压力;提升响应速度;缓存热点数据;应对突发流量;降低数据库连接数;提升系统吞吐量
Q82: 加缓存前后性能提升了多少?如何评估?
【核心解析】 对比平均响应时间;对比QPS/TPS;缓存命中率;数据库负载下降比例;通过压测或监控数据评估
Q83: MySQL 的隔离级别有哪些?默认隔离级别是什么?工业中常用的是哪个?
【核心解析】 四种隔离级别:读未提交、读已提交、可重复读、串行化;MySQL默认隔离级别是可重复读;工业中常用读已提交(如Oracle)或可重复读(MySQL);可重复读通过MVCC实现,避免幻读需加间隙锁;读已提交避免脏读,但不可重复读。
Q84: 写一个 SQL:找出表中至少连续3次出现的记录。
【核心解析】 使用自连接或窗口函数;假设表结构为(id, num),查询连续3次相同num;方法1:自连接 t1.num=t2.num and t2.id=t1.id+1 and t3.id=t2.id+1;方法2:窗口函数 LAG/LEAD 或 ROW_NUMBER 分组;注意去重。
Q85: MySQL 常用的存储引擎有哪些?
【核心解析】 常用存储引擎:InnoDB(默认,支持事务、行锁、外键)、MyISAM(不支持事务、表锁、全文索引)、Memory(内存表,速度快但数据易失);InnoDB适合OLTP,MyISAM适合OLAP;其他:Archive、CSV等。
Q86: 请介绍数据库的事务隔离级别,以及它们分别会解决或产生什么问题。
【核心解析】 四种隔离级别:读未提交、读已提交、可重复读、串行化;读未提交有脏读问题;读已提交避免脏读但不可重复读;可重复读避免脏读和不可重复读但可能幻读(MySQL通过MVCC+间隙锁解决);串行化避免所有问题但性能低。
Q87: 请简单介绍MVCC的原理。
【核心解析】 MVCC(多版本并发控制)通过保存数据的历史版本实现非锁定读;每个事务有事务ID,每行记录有隐藏列(DB_TRX_ID、DB_ROLL_PTR等);读操作根据ReadView判断可见性;写操作创建新版本;用于实现读已提交和可重复读隔离级别。
Q88: 为什么数据库主要使用B+树作为索引结构?
【核心解析】 B+树非叶子节点不存储数据,叶子节点存储所有数据并形成有序链表,适合范围查询;树高度低,减少磁盘I/O;节点大小与磁盘页对齐;支持顺序访问和随机访问;相比B树,B+树查询更稳定,范围查询更高效。
Q89: 数据库中锁的使用有哪些?不同粒度的锁如何影响并发?
【核心解析】 锁粒度包括表级锁、行级锁、页级锁;表锁开销小但并发低;行锁并发高但开销大;InnoDB支持行锁和间隙锁;锁粒度影响死锁概率和性能。
Q90: 对于联合索引(a, b, c),查询条件为WHERE a=? AND c=?时,索引是如何使用的?
【核心解析】 会使用索引,但只用到a列进行索引过滤;c列无法利用索引,因为不满足最左前缀原则;可能发生索引下推(ICP),在存储引擎层过滤c条件,减少回表次数;如果c列选择性高,ICP能显著提升性能。
Q91: MySQL为什么选择B+树作为索引的数据结构?
【核心解析】 B+树非叶子节点不存储数据,只存键值,可容纳更多索引项,降低树高;叶子节点形成有序链表,支持范围查询和排序;所有数据都在叶子节点,查询稳定;磁盘I/O次数少,适合磁盘存储;相比红黑树、哈希表等更优。
Q92: 游标分页插入数据时如何避免漏数据或重复数据?
【核心解析】 使用有序唯一字段作为游标;避免基于偏移量的分页;事务隔离级别保证一致性;插入前检查唯一约束;乐观锁或版本号;批量插入与去重
Q93: B+树是怎么样的结构?
【核心解析】 多路平衡查找树,所有数据存储在叶子节点;非叶子节点只存储索引键和指针;叶子节点形成有序链表,支持范围查询;高度较低,减少磁盘IO;节点大小通常等于磁盘页;插入和删除操作保持平衡;常用于数据库索引
Q94: 数据库的索引与锁机制
【核心解析】 索引:B+树、哈希索引;加速查询,但降低写性能;锁:表锁、行锁、间隙锁;InnoDB支持行锁和MVCC;锁粒度影响并发性能;死锁检测与处理;索引优化可减少锁冲突;间隙锁防止幻读
Q95: 如果在分析执行计划(EXPLAIN)时,发现查询走了全表扫描而不是索引扫描,你会如何判断是否需要优化?
【核心解析】 检查查询条件是否使用了索引列;查看索引选择性,若区分度低可能优化器认为全表扫描更优;检查表数据量,小表全表扫描可能更快;使用FORCE INDEX强制索引测试;分析查询是否导致索引失效(如函数操作、隐式类型转换);考虑添加或调整索引。
Q96: MySQL中InnoDB与MyISAM存储引擎的区别是什么?为什么选择InnoDB?
【核心解析】 InnoDB支持事务、行级锁、外键,MyISAM不支持;InnoDB使用聚簇索引,MyISAM使用非聚簇索引;InnoDB支持崩溃恢复,MyISAM不支持;InnoDB支持MVCC,MyISAM不支持;InnoDB是默认引擎,适合高并发和事务场景。
Q97: MySQL中B+树索引与Hash索引的应用场景有何不同?
【核心解析】 B+树索引支持范围查询、排序、模糊匹配,适合磁盘I/O;Hash索引仅支持等值查询,适合内存场景;B+树索引有顺序性,Hash索引无序;B+树索引可覆盖索引,Hash索引不能。
Q98: MySQL 的隔离级别有哪些?分别解决什么问题?
【核心解析】 读未提交(RU):允许脏读;读已提交(RC):避免脏读,但不可重复读;可重复读(RR):避免脏读和不可重复读,默认级别,通过 MVCC 实现;串行化:最高隔离,避免幻读,性能最低。
Q99: 读未提交隔离级别有什么使用场景?
【核心解析】 极少使用,因为存在脏读风险;可能用于对一致性要求极低的场景,如日志记录;或用于性能优先且可容忍错误数据的场景;一般生产环境不推荐。
Q100: MySQL 中常见的死锁场景有哪些?
【核心解析】 两个事务互相等待对方持有的锁;不同事务以不同顺序加锁;间隙锁与插入意向锁冲突;索引锁升级导致锁范围扩大;通过 SHOW ENGINE INNODB STATUS 分析死锁。
Q101: 有哪些情况会导致慢查询?
【核心解析】 索引失效(如隐式类型转换、函数操作);未使用索引或全表扫描;数据量过大且分页偏移量过大;锁等待(行锁、间隙锁等);查询语句复杂(如多表JOIN、子查询);服务器硬件或配置问题(如内存不足、IO瓶颈)
Q102: 详细讲讲行锁、间隙锁和临键锁。
【核心解析】 行锁锁定单行记录,防止其他事务修改;间隙锁锁定索引记录之间的间隙,防止幻读;临键锁是行锁与间隙锁的组合,锁定左开右闭区间;InnoDB通过临键锁实现可重复读隔离级别;间隙锁只在可重复读级别下生效;临键锁可能引发死锁
Q103: 在存储引擎为InnoDB的MySQL中,分页获取数据(每页10条),如何获得第50w页的数据?
【核心解析】 避免使用LIMIT偏移量过大,如LIMIT 5000000, 10;优化方法:使用覆盖索引(如主键)先定位起始位置,再获取数据;或使用子查询:SELECT * FROM table WHERE id > (SELECT id FROM table ORDER BY id LIMIT 5000000, 1) LIMIT 10;或利用延迟关联
Q104: MySQL的索引为什么是B+树?
【核心解析】 B+树非叶子节点不存储数据,减少IO次数;叶子节点形成有序链表,支持范围查询;树高较低,查询稳定。
Q105: SQL优化题:给建表语句和查询语句,不加索引怎么优化?
【核心解析】 优化查询语句:避免全表扫描、使用覆盖索引、减少返回列、合理使用JOIN和子查询;调整表结构:分区、分表。
Q106: 慢查询排查优化完整流程是什么?
【核心解析】 开启慢查询日志;分析慢查询日志;使用EXPLAIN分析执行计划;优化索引、SQL语句;调整数据库参数。
Q107: InnoDB默认隔离级别是什么?解决了哪些问题?怎么解决幻读的?
【核心解析】 默认可重复读;解决脏读、不可重复读;通过MVCC和间隙锁(Next-Key Lock)解决幻读。
Q108: 事务四大特性是什么?
【核心解析】 原子性、一致性、隔离性、持久性。