[每周一更]-(第122期):模拟面试|数据库面试思路解析

ops/2024/11/14 1:39:56/

在这里插入图片描述

10|数据库索引:为什么 MySQL 用 B+ 树而不用 B 树?

  1. 为什么 MySQL 用 B+ 树而不用 B 树?

  2. 什么是覆盖索引?

  3. 什么是聚簇索引/非聚簇索引?

  4. 什么是哈希索引?MySQL InnoDB 引擎怎么创建一个哈希索引?

  5. 什么回表?如何避免回表?

  6. 树的高度和查询性能是什么关系?

  7. 什么是索引最左匹配原则?

  8. 范围查询、Like 之类的查询怎么影响数据库使用索引?

  9. 索引是不是越多越好?

  10. 使用索引有什么代价?

  11. 如何选择合适的索引列?组合索引里面怎么确定列的顺序?状态类的列是否适合作为索引的列?

  12. 为什么 MySQL 使用 B+ 树作为索引的数据结构?为什么不用 B 树?为什么不用红黑树?为什么不用二叉平衡树?为什么不用跳表?

  13. NULL 对索引有什么影响?

  14. 唯一索引是否允许多个NULL 值?

1.为什么 MySQL 用 B+ 树而不用 B 树?

  • B+ 树节点只有索引,而数据存储在叶子节点,并通过指针连接各叶子节点,便于范围查询顺序扫描批量读取。相比之下,B 树的数据分布在所有节点上,范围查询效率较低。
  • MySQL 使用 B+ 树而不是 B 树是因为 B+ 树将所有数据都保存在叶子节点,并将这些节点按顺序连接。这使得 B+ 树适合范围查询顺序扫描,尤其是批量读取时可以减少磁盘 I/O 次数,提高查询性能。B 树则将数据存储在所有节点中,没有叶子节点间的顺序连接,不适合数据库的常见查询模式。

2.什么是覆盖索引?

  • 覆盖索引指的是在查询时,只需要从索引中获取数据而不必回表,因为查询所需的字段已包含在索引中。这可以减少 I/O 操作,提升查询效率。

3.什么是聚簇索引/非聚簇索引?

  • 聚簇索引将数据和索引存储在一起。主键是聚簇索引,通过主键可以快速找到数据行。InnoDB 使用主键作为聚簇索引。
  • 非聚簇索引则将索引和数据分离存储,索引中保存了指向数据行的地址。查询时需要先查找索引,再通过索引指向数据行位置。查询非聚簇索引数据通常需要额外的“回表”操作。

4.什么是哈希索引?MySQL InnoDB 引擎怎么创建一个哈希索引?

  • 哈希索引通过哈希函数来加速等值查询(=)。InnoDB 自适应哈希索引自动为高频查询生成哈希索引,但用户不能手动创建。

5.什么是回表?如何避免回表?

  • 回表指索引未包含查询的所有字段,导致数据库需从表中再次查找完整数据。可以使用覆盖索引或调整查询字段避免回表。

6.树的高度和查询性能是什么关系?

  • 树的高度越低,查询性能越高。因为 B+ 树每层节点包含多个分支(多叉树),一般 2-3 层即可覆盖大数据量,通过较少的磁盘读取完成查询,保证查询高效。

7.什么是索引最左匹配原则?

  • 对于组合索引(如 (a, b, c)),最左匹配原则是优先使用最左边的字段;即 a 可以用索引,a, b 可以用,b, c 则无法单独利用索引。

8.范围查询、Like 之类的查询怎么影响数据库使用索引?

  • 范围查询(<<=>>=BETWEEN)会停止组合索引的最左匹配原则,且范围查询后面的字段无法利用索引。
  • LIKE 查询中,只有前缀匹配(LIKE 'abc%')能用索引,前缀带 %LIKE '%abc')则无法利用索引。

9.索引是不是越多越好?

  • 不是。索引会增加存储开销更新成本,维护过多索引会影响写入和更新性能。因此应根据查询需求合理创建索引。

10.使用索引有什么代价?

  • 索引占用存储空间,更新或插入数据时需要维护索引,导致写入性能下降。

11.如何选择合适的索引列?组合索引里面怎么确定列的顺序?状态类的列是否适合作为索引的列?

  • 根据查询频率过滤性选择列。组合索引中的顺序按选择性高的字段优先排列,确保常用查询能有效利用索引。

  • 状态类列如性别、状态等通常选择性低(例如只有 0 和 1),适合作为复合索引的一部分,但不适合单独作为索引列。

12.为什么 MySQL 使用 B+ 树作为索引的数据结构?为什么不用 B 树?为什么不用红黑树?为什么不用二叉平衡树?为什么不用跳表?

  • B+ 树的叶子节点链表结构有利于范围查询;多叉树的低树高适合存储和查询大数据。
  • 红黑树、二叉平衡树、跳表在大数据场景下的树高和随机 I/O 操作较多,性能不如 B+ 树。

13.NULL 对索引有什么影响?

  • 对于 B+ 树索引,NULL 值可以索引,但可能影响查询优化器的选择,特别在 WHERE 子句有多条件查询时,尽量避免索引字段中存储 NULL 值。

14.唯一索引是否允许多个 NULL 值?

  • 是的,唯一索引允许多个 NULL,因为 NULL 被认为是未知值,两个 NULL 不相等。

11|SQL 优化:如何发现 SQL 中的问题?

  1. 请你解释一下 EXPALIN 命令。
  2. 你有优化过 SQL 吗?具体是怎么优化的?
  3. 你有没有优化过索引?怎么优化的?
  4. 怎么优化 COUNT 查询?
  5. 怎么优化 ORDER BY?
  6. 怎么优化 LIMIT OFFSET 查询?
  7. 为什么要尽量把条件写到 WHERE 而不是写到 HAVING 里面?
  8. 怎么给一张表添加新的索引/修改表结构?如果我的数据量很大呢?
  9. USE INDEX/FORCE INDEX/IGNORE INDEX 有什么效果?

1.请解释一下 EXPLAIN 命令。

  • EXPLAIN 命令可以帮助查看 SQL 语句的执行计划,包括如何选择索引、扫描方式、行数预估等信息。它提供关键字段如 typekeyrowsextra,用于分析查询效率,找出性能瓶颈。

2.你有优化过 SQL 吗?具体是怎么优化的?

  • SQL 优化常见方法包括:创建合适的索引、避免全表扫描、使用覆盖索引、减少子查询、优化 JOIN 语句、将频繁查询的结果缓存等。例如,将子查询替换为 JOIN,或通过覆盖索引来减少回表查询。

3.你有没有优化过索引?怎么优化的?

  • 索引优化包括创建合适的单列索引或组合索引,调整组合索引的列顺序,避免冗余索引,删除不常用或选择性低的索引等。此外,使用 EXPLAIN 查看索引的使用情况,有助于识别低效或无效索引。

4.怎么优化 COUNT 查询?

  • 优化

    COUNT
    

    查询可以使用:

    • 使用统计缓存表来存储记录数。
    • 当仅需检查数据存在时,用 COUNT(1)EXISTS 来替代 COUNT(*)
    • 对于大数据量表,避免用 COUNT 直接查询整个表的行数,可以分表、分区或统计汇总表来提高效率。

5.怎么优化 ORDER BY?

  • ORDER BY 可以通过索引优化,比如对排序字段创建索引。对于大数据量的 ORDER BY,可以使用 LIMIT 限制返回的行数,或借助覆盖索引(比如 ORDER BY 使用索引字段且符合最左前缀原则),避免排序操作耗时过长。

6.怎么优化 LIMIT OFFSET 查询?

  • LIMIT OFFSET 查询性能差的原因是数据库必须扫描和丢弃 OFFSET 前的数据。优化方法包括:
    • 使用覆盖索引优化。
    • JOIN 查询来实现分页,将上次查询的最大 ID 作为起始点,这样避免了大量偏移数据扫描。

7.为什么要尽量把条件写到 WHERE 而不是写到 HAVING 里面?

  • WHERE 在数据聚合前过滤数据,效率更高,而 HAVING 在聚合后进行过滤,适合用于聚合函数的筛选。尽量将不涉及聚合的条件放在 WHERE,减少处理的数据量,加快查询速度。

8.怎么给一张表添加新的索引/修改表结构?如果我的数据量很大呢?

  • 对大表添加索引或修改结构可以使用在线索引创建工具或分批操作,如 Percona 提供的 pt-online-schema-change。避免直接在生产环境大表上添加索引,否则会导致锁表和性能下降。

9.USE INDEX/FORCE INDEX/IGNORE INDEX 有什么效果?

  • USE INDEX 指示查询使用指定索引。
  • FORCE INDEX 强制查询使用指定索引,即使优化器认为其他方式更好。
  • IGNORE INDEX 忽略指定索引,从而让优化器选择其他索引或进行全表扫描。

12|数据库锁:明明有行锁,怎么突然就加了表锁?

  1. 什么是行锁、表锁?什么时候加表锁?怎么避免?
  2. 什么是乐观锁?怎么在 MySQL 里面实现一个乐观锁?
  3. 什么是意向锁?可以举一个例子吗?
  4. 什么是共享锁和排它锁?它们有什么特性?
  5. 什么是两阶段加锁?
  6. 什么是记录锁、间隙锁和临键锁?
  7. RC 级别有间隙锁和临键锁吗?
  8. MySQL 是怎么在 RR 级别下解决幻读的?
  9. 什么情况下会加临键锁?什么情况下会加间隙锁?什么时候加记录锁?
  10. 唯一索引和普通索引会怎么影响锁?
  11. 你遇到过什么死锁问题吗?怎么排查的?最终又是怎么解决的?
  12. 你有没有优化过锁?怎么优化的?

1.什么是行锁、表锁?什么时候加表锁?怎么避免?

  • 行锁:针对单行数据的锁,粒度小,适合并发场景;主要用于 UPDATEDELETE 操作。
  • 表锁:锁住整张表,适合低并发、大批量操作。MySQL 自动加表锁的情况一般包括:当未命中索引时的 DELETEUPDATE 或执行 ALTER 操作。
  • 避免表锁

http://www.ppmy.cn/ops/133046.html

相关文章

深入浅出rust内存对齐

在 Rust 中&#xff0c;内存对齐是一个重要的概念&#xff0c;它涉及到数据在内存中的存储方式&#xff0c;以及如何优化内存访问的效率。往往一门语言的内存布局以及对齐方式决定了一门语言的性能&#xff0c;因此学会并深入理解rust中内存布局会让我们写出高性能的rust代码&a…

高级java每日一道面试题-2024年10月28日-RabbitMQ篇-RabbitMQ的使用场景有哪些?

如果有遗漏,评论区告诉我进行补充 面试官: RabbitMQ的使用场景有哪些? 我回答: RabbitMQ是一个开源的消息代理和队列服务器&#xff0c;它遵循高级消息队列协议&#xff08;AMQP&#xff09;。RabbitMQ的核心作用是作为应用程序之间的中介&#xff0c;实现异步消息传递。它…

【系统架构设计师-2024下半年真题】案例分析-参考答案及部分详解(完整回忆版)

更多内容请见: 备考系统架构设计师-专栏介绍和目录 文章目录 材料一【问题1】(14分)【问题2】(11分)材料二【问题1】(10分)【问题2】(6分)【问题3】(9分)材料三【问题1】(13分)【问题2 】(8分)【问题3 】(7分)材料四【问题1】(6分)【问题2】(12分)【问题3…

SpringBoot赋能的共享汽车业务管理系统

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…

数值优化 | 图解牛顿法、阻尼牛顿法与高斯牛顿法(附案例分析与Python实现)

目录 0 专栏介绍1 引例2 牛顿迭代法3 阻尼牛顿法4 高斯牛顿法5 案例分析与Python实现5.1 牛顿法实现5.2 阻尼牛顿法实现5.3 高斯牛顿法实现5.4 案例分析 0 专栏介绍 &#x1f525;课设、毕设、创新竞赛必备&#xff01;&#x1f525;本专栏涉及更高阶的运动规划算法轨迹优化实…

《TCP/IP网络编程》学习笔记 | Chapter 9:套接字的多种可选项

《TCP/IP网络编程》学习笔记 | Chapter 9&#xff1a;套接字的多种可选项 《TCP/IP网络编程》学习笔记 | Chapter 9&#xff1a;套接字的多种可选项套接字可选项和 I/O 缓冲大小套接字多种可选项getsockopt & setsockoptSO_SNDBUF & SO_RCVBUF SO_REUSEADDR发生地址绑定…

2024 年直播新潮流:AI 无人自动直播,帮你全天候自动直播带货!

在瞬息万变的数字时代&#xff0c;直播行业始终处于不断革新与发展的浪潮之中。2024 年&#xff0c;一种全新的直播潮流正席卷而来&#xff0c;那就是 AI 无人自动直播&#xff0c;它宛如一颗璀璨的新星&#xff0c;为直播带货领域带来了前所未有的机遇与变革&#xff0c;开启了…

Kafka Eagle 安装教程

目录 前言 一、安装前的准备 1. 系统要求 2. 安装 JDK 3. 安装 Kafka 和 Zookeeper 4. MySQL 环境准备 二、下载并安装 Kafka Eagle 三、配置 Kafka Eagle 1. 编辑配置文件 2. 配置 Kafka 和 Zookeeper 信息 四、启动 Kafka Eagle 五、访问 Kafka Eagle 六、测试功…