当前位置: 首页 > ds >正文

高频面试--MySQL

Mysql


1. InnoDB采用的数据结构

InnoDB 使用 B+树 作为索引结构:

  • 主键索引(聚簇索引):叶子节点直接存储数据行,数据按主键顺序存储。
  • 非主键索引(二级索引):叶子节点存储主键值,查询需回表到主键索引获取数据。
  • 优势:B+树层数低、范围查询高效(叶子节点形成链表),适合磁盘IO优化。

2. 为何采用B+树而非其他结构
  • B树:B+树非叶子节点不存数据,单页可存更多键值,树高更低,减少IO次数。
  • 哈希表:仅适合等值查询,不支持范围查询和排序。
  • 二叉搜索树:树高较高,多次IO效率低,且易退化为链表。
  • LSM树:适合写多读少场景,但读性能不如B+树稳定。

3. 覆盖索引

若查询的字段全部包含在索引中,无需回表,直接通过索引返回数据。
示例

-- 创建联合索引 (a, b)
CREATE INDEX idx_a_b ON table(a, b);-- 查询a和b字段,直接走覆盖索引
SELECT a, b FROM table WHERE a = 1;

4. 索引下推(Index Condition Pushdown, ICP)

在存储引擎层利用索引过滤数据,减少回表次数。
示例

-- 联合索引 (a, b)
SELECT * FROM table WHERE a = 1 AND b > 10;
-- 存储引擎层直接过滤a=1且b>10的记录,无需将所有a=1的记录回表后再过滤。
5. 联合索引的最左前缀法则
  • 规则:索引按最左列开始匹配。例如,索引 (a, b, c),查询条件需包含 a 才能命中索引。
  • 优化器优化:即使 WHERE 条件顺序为 b, a, c,优化器会调整顺序以匹配索引。
  • 例外:跳过中间列的查询无法使用后续列索引(如 a, c 只能用 a 列索引)。

6. RR隔离级别下如何减少幻读
  • ReadView机制:事务首次读时生成快照,后续读基于此快照,保证一致性视图。
  • Next-Key Lock(间隙锁+记录锁):锁住记录及间隙,阻止其他事务插入新数据。
    组合效果
    • 快照读(如普通 SELECT)通过 ReadView 避免幻读。
    • 当前读(如 SELECT FOR UPDATE)通过 Next-Key Lock 阻止其他事务插入。

7. undo log的WAL机制
  • WAL(Write-Ahead Logging):事务提交时先写日志(redo/undo log),再写数据页。
  • undo log作用
    • 事务回滚时恢复数据。
    • 实现 MVCC(多版本并发控制),提供一致性读视图。
      流程:修改数据前记录旧值到 undo log,保证事务的原子性和隔离性。

8. 主从复制机制
  • 异步复制:主库提交事务后立即返回,不等待从库同步(性能高,数据一致性弱)。
  • 半同步复制:主库等待至少一个从库接收并写入 relay log 后才返回(平衡性能与一致性)。
  • 全同步复制:主库等待所有从库提交事务(强一致,但延迟高,少用)。

9. 慢SQL查询优化思路
  1. 分析执行计划:使用 EXPLAIN 查看索引使用情况,避免全表扫描。
  2. 优化索引
    • 添加缺失索引,优化联合索引顺序。
    • 避免冗余索引,使用覆盖索引减少回表。
  1. 改写SQL
    • 拆分复杂查询,减少子查询和临时表。
    • 避免 SELECT *,仅查询必要字段。
  1. 分库分表:对大数据量表进行水平或垂直拆分。
  2. 调整配置
    • 增大 innodb_buffer_pool_size 提升缓存命中率。
    • 调整 join_buffer_sizesort_buffer_size
  1. 监控与日志
    • 开启慢查询日志(slow_query_log),定期分析优化。


http://www.xdnf.cn/news/9403.html

相关文章:

  • 【Python打卡Day31】文件的拆分与使用@浙大疏锦行
  • 【C语言练习】066. 使用typedef定义新类型
  • 【每天一个知识点】智能体(Agent)”与“思维链(Chain of Thought, CoT)
  • 为什么选择迪宇电力厂家的绝缘胶垫?有什么优势以及产品参数
  • Python应用嵌套猜数字小游戏
  • 数据库大学实验二
  • PyTorch入门-Transorforms
  • 2.2.1 05年T3
  • python处理signal(信号)
  • 基于大模型的慢性胃炎全周期预测与诊疗方案研究报告
  • 联合索引与最左前缀原则详解
  • Springboot-基础
  • LY/T 2714-2016 木塑门套线检测
  • Spring Boot整合Spring AI全攻略:构建智能应用的工程实践
  • Java 并发编程通关秘籍——08死锁
  • webpack CDN打包优化
  • 有什么excel.js支持IE11,可以显示EXCEL单元格数据,支持单元格合并,边框线,单元格背景
  • LangGraph + LLM + stream_mode
  • WPF命令与MVVM模式:打造优雅的应用程序架构
  • 【AI News | 20250527】每日AI进展
  • springboot--实战--大事件--用户接口开发
  • 【机器学习基础】机器学习入门核心算法:支持向量机(SVM)
  • MySQL-查询测试
  • cf1703F
  • leetcode hot100刷题日记——18.搜索插入位置
  • Redis学习打卡-Day8-Redis实践
  • docker环境搭建与常用指令
  • 聊一聊 .NET Dump 中的 Linux信号机制
  • 什么是大端序,什么是小端序,如何记忆它们!!!
  • 2025最新Gemini 2.5 Pro API限制全面解析:最完整的使用指南与优化方案