MySQL相关面试题(索引,事务)
1. 什么是索引索引是帮助 MySQL高效查询数据的数据结构InnoDB 底层是 B 树。 ✅优点大幅提升查询速度排序分组优化。 ❌缺点占用磁盘空间增删改操作需要维护索引降低写入性能。一句话总结索引不是越多越好给经常查询的字段建索引。2. 索引的分类按数据结构B 树索引、哈希索引、全文索引物理存储聚簇索引、非聚簇二级索引逻辑主键索引、普通索引、唯一索引、联合索引3. InnoDB 为什么使用 B 树不用 B 树B 树非叶子节点只存索引 key不存数据一页能存更多索引树高度更低减少磁盘 IO。全部真实数据都放在叶子节点范围查询、分页查询性能更好。叶子节点用双向链表串联order by排序效率高。B 树非叶子节点同时存 key 数据一页存放索引更少树更高IO 次数更多。4. 聚簇索引 和 二级索引区别聚簇索引叶子节点存放完整的行数据一张表只能有 1 个默认主键就是聚簇索引表数据本身就是按聚簇索引 B 树组织存放。二级索引叶子节点存放主键值查询到主键后再去聚簇索引查找完整数据这个过程叫回表。5. 二级索引叶子节点为什么存主键不存物理磁盘地址如果存物理地址当聚簇索引发生页分裂、数据移动数据物理地址会变。 那么所有二级索引都要同步更新地址更新代价巨大。 主键稳定不变所以二级索引存主键成本更低。6. 覆盖索引是什么查询需要的所有字段都在二级索引 B 树里面不需要回表查询聚簇索引减少 IO性能很高。口诀索引列包含 select 所有查询字段 → 覆盖索引。7. 什么时候适合建索引where条件经常用到的字段join连接字段order by / group by字段主键、唯一约束字段外键字段不适合数据量小更新频繁字段区分度低查询返回大部分数据。8. 索引失效场景高频索引列做运算、函数、表达式计算索引失效like %前缀左模糊查询B 树无法定位隐式类型转换字段和传入参数类型不一致联合索引不满足最左前缀原则or连接条件两边字段不是都有索引not、!、is not null不一定失效但容易不走索引MySQL 优化器判断全表扫描比索引更快主动放弃索引9. 聚簇索引使用注意事项一张表只能有一个聚簇索引主键尽量不要修改主键变更会导致所有二级索引更新大字段不适合做主键二级索引会存储主键占用大量空间主键推荐自增 ID有序插入减少页分裂写入性能好10. 事务 ACID 四大特性原子性 (A)事务不可拆分要么全部成功失败全部回滚由undo log实现。一致性 ©事务执行前后数据合法一致是最终目标A、I、D 共同保障。隔离性 (I)多个事务之间互相隔离互不干扰由锁 MVCC实现。持久性 (D)事务提交成功数据永久保存断电崩溃不丢失由redo log实现。11. 事务隔离级别从低到高InnoDB 默认 RR读未提交 RU能读到未提交数据脏读、不可重复读、幻读都存在。读已提交 RC只能读到已经提交的数据解决脏读存在不可重复读、幻读。可重复读 RRMySQL 默认解决脏读、不可重复读仍存在幻读。串行化最高级别所有并发问题解决事务串行执行并发性能差。12. 并发三个问题脏读事务读到其他事务未提交的数据。不可重复读同一个事务多次读取同一行数据结果不一样别的事务修改提交。幻读同一个事务范围查询别的事务插入新行两次查询行数不一致。区分不可重复读针对数据修改幻读针对新增 / 删除。13. InnoDB 和 MyISAM 区别InnoDB支持事务、行锁、外键、MVCC崩溃安全读写均衡场景MySQL5.5 后默认引擎。MyISAM不支持事务表锁支持全文索引读多写少崩溃不安全。14. MySQL 各类日志作用redo log重做日志保证事务持久性崩溃恢复刷盘落数据。undo log回滚日志原子性事务回滚同时提供 MVCC 多版本。binlog二进制日志记录所有 DDL/DML主从复制、数据恢复。slow query log慢查询日志记录超过阈值 SQL用于 SQL 优化。error log错误日志记录启动运行报错。15. SQL 执行顺序select → from → where → group by → having → order by注意where 在 group by 前面不能用聚合函数having 是分组后过滤。16. char 和 varchar 区别char固定长度字符串不足长度自动补空格查询速度快浪费空间。varchar变长字符串按实际长度存储节省空间性能略低。17. datetime 和 timestamp 区别datetime8 字节时间范围很大不受时区影响。timestamp4 字节范围小到 2038 年和数据库时区绑定。18. MyBatis 中 #{} 和 ${}#{}预编译占位符底层 PreparedStatement防止 SQL 注入推荐用于条件值。${}直接字符串拼接存在 SQL 注入风险只能用于动态表名、字段必须自己校验。19. 大数据量分页优化缓存Redis 缓存热点数据前端本地缓存。检索ES 做海量数据搜索。MySQL 侧覆盖索引减少回表。主键分页id 上一页最大id避免大 offset 偏移。20. MVCC 多版本并发控制InnoDB 实现RC、RR 隔离级别的核心机制。 原理数据行保存多个版本快照快照读不加锁读写不冲突提升并发。 依赖 undo log 版本链 read view 实现。额外高频 MySQL 面试题Q1什么是 MVCC快照读和当前读MVCC 多版本并发控制InnoDB 用来实现隔离级别提升并发。快照读普通 select读取快照版本不加行锁。当前读select ... for update/update/delete读取最新版本加行锁。Q2什么是两阶段锁事务分为加锁阶段、释放锁阶段。事务执行过程加锁事务提交 / 回滚一次性释放锁。是 RR 隔离级别解决不可重复读的基础。Q3联合索引最左前缀原理联合索引(a,b,c)索引 B 树按 a 排序a 相同按 bb 相同按 c。 查询条件必须满足最左 N 个连续字段才能命中索引。跳过左边字段后面索引失效。Q4什么是死锁怎么避免多个事务互相持有对方需要的锁循环等待。 避免统一锁获取顺序减少事务粒度避免长事务。Q5explain 关键字看哪些字段type访问类型最好 ref/range最差 all 全表、key实际用到索引、rows扫描行数、Extra额外信息Using filesort/Using temporary 代表性能差。Q6MySQL 主从复制原理主库写入记录 binlog从库 IO 线程拉取 binlog 写入 relay log从库 SQL 线程回放中继日志同步数据。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →