答案要点 MySQL 是一款开源的关系型数据库(RDBMS),基于 SQL 语言,主打轻量、高性能、高可用、易部署,是互联网行业首选的数据库(电商、金融、社交等 90% 以上业务都在用)。核心特点:

InnoDB(默认)、MyISAM。✅ 核心结论:MySQL5.5 及以后,默认存储引擎是 InnoDB,InnoDB 是事务安全型引擎,MyISAM 是性能型引擎,MyISAM 已被官方逐步淘汰。
答案要点 二者都是字符串类型,核心区别是存储方式和长度固定性,面试必问第二个问题,是经典坑点!
n 个字符的空间,不足补空格;查询速度极快,适合短字符串、长度固定的场景。✅ 标准答案:存储上无区别,性能上几乎无区别
3 + 1 个字节。varchar(255/65535),要按需定义,避免字段长度溢出、索引失效。答案要点 二者都是日期时间类型,核心区别是存储范围、时区支持、占用空间:
1000-01-01 ~ 9999-12-31,不支持时区转换,存入什么时间就显示什么时间,不受数据库时区影响。1970-01-01 ~ 2038-01-19,支持时区转换,存入时会转成 UTC 时间,查询时按当前时区转回,占用空间更小。适用场景:业务无时区需求 → 用 datetime;有跨国 / 跨时区需求 → 用 timestamp;推荐用 datetime,避免 2038 年溢出问题。答案要点
索引是 MySQL 的一种特殊数据结构(B + 树),建立在表的一个或多个字段上,索引存储了字段的值和对应的行数据地址,相当于表的「目录」。
O(n);O(logn);索引不是越多越好,有优点必有缺点,这是面试加分项:
答案要点(必须背会,面试满分答案)
(a,b,c)的联合索引时,MySQL 会优先匹配索引的最左侧字段,并依次向右匹配,跳过的字段会导致索引失效。where a=1、where a=1 and b=2、where a=1 and b=2 and c=3 → 全匹配索引;where b=2、where c=3、where b=2 and c=3 → 跳过了最左的 a,索引完全失效;where a=1 and c=3 → a 字段走索引,c 字段不走索引(中间跳过 b)。where a=1 and b>2 and c=3 → a、b 走索引,c 字段失效。✅ 面试结论:创建联合索引时,把查询频率最高、筛选性最强的字段放在最左侧。
答案要点(标准答案,分点作答,面试满分)
✅ 对比 1:为什么不用【哈希索引】?
哈希索引是键值对映射,查询效率 O(1),看似更快,但有致命缺陷,MySQL 仅 Memory 引擎支持:
✅ 对比 2:为什么不用【二叉树 / 红黑树】?
O(logn)变成O(n),完全失效;✅ 对比 3:为什么不用【B 树】,而用 B + 树?
B 树和 B + 树都是多路平衡树,核心区别在叶子节点,B + 树是 B 树的优化版,完美适配 MySQL 的磁盘存储,优势有 3 点:
✅ 面试总结:B + 树完美适配 MySQL 的「磁盘 IO」和「范围查询」两大核心需求,是最优解。
答案要点(背诵即可,分点清晰)事务是数据库中一组不可分割的 SQL 操作,要么全部执行成功,要么全部失败回滚,事务的核心是四大特性,简称 ACID:
✅ 核心逻辑:事务隔离级别就是为了解决并发事务的三大问题,隔离级别越高,并发问题越少,性能越低。
所有隔离级别都基于 SET TRANSACTION ISOLATION LEVEL 级别名 设置,MySQL 默认隔离级别:可重复读(RR),Oracle 默认:读已提交(RC)。
✅ 标准答案:InnoDB 在 RR 级别下,通过 「间隙锁 + 临键锁」的组合(Next-Key Lock),锁住了数据的「行 + 区间」,彻底阻止了其他事务的新增 / 删除操作,从而解决了幻读问题。
InnoDB 是行锁为主、表锁为辅的存储引擎,这也是它并发性能远超 MyISAM 的核心原因,锁的粒度越小,并发越高。
这是业务层的锁机制,不是数据库原生锁,面试必问,也是生产中解决并发问题的核心方案,两者无优劣,按需选择。
悲观锁(Pessimistic Lock)
select ... for update(排他锁),select ... lock in share mode(共享锁)。乐观锁(Optimistic Lock)
version字段,更新时判断版本号是否一致:update table set name='xxx', version=version+1 where id=1 and version=2。✅ 面试结论:写多读少用悲观锁,读多写少用乐观锁,这是生产环境的最优选型。
MySQL 的三大日志是保证数据安全、事务一致性、主从复制的核心,三者缺一不可,面试必问,也是理解 InnoDB 的关键,必须分清楚三者的作用和区别。
答案要点(精简版,面试够用,不啰嗦)
✅ 核心:面试时回答这个问题,一定要分步骤、有逻辑,体现你有完整的问题排查和优化思路,这是企业最看重的实战能力!
步骤 1:开启慢查询日志,定位慢 SQL
slow_query_log = ON,设置慢查询阈值:long_query_time = 1(执行时间 > 1 秒的 SQL 为慢查询);show slow logs,或用工具mysqldumpslow分析日志,找到执行时间长、扫描行数多的慢 SQL。步骤 2:用 EXPLAIN 分析慢 SQL 执行计划(核心)
EXPLAIN + 慢SQL,查看执行计划的关键字段:type、key、rows、Extra;type:查询类型,最优是const,其次是eq_ref、range、ref,最差是ALL(全表扫描,必须优化);✔ key:是否命中索引,为NULL表示无索引,需要创建索引;✔ rows:扫描的行数,行数越少越好;✔ Extra:出现Using filesort(文件排序)、Using temporary(临时表)、Using index(覆盖索引)是关键优化点。步骤 3:优化索引(最常用、最有效的优化手段)
步骤 4:优化 SQL 语句本身(避坑,核心)
select *,只查需要的字段,实现「覆盖索引」;%xxx模糊查询(左模糊会导致索引失效);in、not in、or,改用exists、union all;select * from table where id>10000 limit 10 替代 limit 10000,10。步骤 5:优化表结构
步骤 6:优化 MySQL 配置参数
innodb_buffer_pool_size(设置为物理内存的 50%-70%)、join_buffer_size、sort_buffer_size;max_connections、wait_timeout;innodb_log_file_size、binlog_cache_size。✅ 核心:索引失效的本质是 MySQL 优化器认为走索引的效率,不如全表扫描高,所以放弃使用索引,所有失效场景都围绕这个核心。
where abs(id)=10、where name like concat('%', 'abc') → 索引失效;✔ 解决:避免在索引字段上做函数 / 运算,业务层处理后再查询。where name like '%abc' → 索引失效,where name like 'abc%' → 索引生效;✔ 解决:业务上尽量用右模糊,必须左模糊则用全文索引。where id != 10 → 索引失效;✔ 解决:尽量用=替代,必须用则业务层过滤。not null,默认值为空字符串 / 0。where id in (1,2,3)、where id=1 or name='abc' → 索引失效;✔ 解决:小数据量 in 可用,大数据量用exists替代;or 改用union all。where id='10' → 索引失效;✔ 解决:保证查询条件的类型和字段类型一致。force index(索引名)强制走索引。✅ 方案 1:优先做「非分表优化」(成本最低,见效最快,首选)
select *、避免大表关联、优化分页查询;partition by range (id),对业务无侵入。✅ 方案 2:分表优化(数据量过大,必选)
当非分表优化无效时,进行分表,分表分为两种,按需选择:
✅ 方案 3:分库分表(终极方案)
当单库的存储和性能达到瓶颈时,采用分库分表,主流中间件:Sharding-JDBC(轻量,推荐)、MyCat;
MySQL 主从复制是异步复制,核心是基于 binlog 日志实现,架构是「一主多从」,主库写,从库读,实现读写分离、负载均衡、数据备份,是 MySQL 高可用的基础:
binlog日志;relay log中继日志;✅ 主从延迟的核心原因
✅ 主从延迟的解决方案(按优先级排序,必背)
rpl_semi_sync_master,主库提交事务后,等待至少一个从库接收 binlog 后再返回,减少延迟;死锁是指两个或多个事务,互相持有对方需要的锁,同时等待对方释放锁,导致所有事务都无法继续执行,陷入无限等待的状态。
✅ 预防死锁(首选,成本最低)
✅ 解决死锁(发生后处理)
show engine innodb status查看死锁日志,定位死锁的事务和 SQL,优化业务逻辑。