面试真实经历某商银行大厂数据库MYSQL问题和答案总结(二)

在 MySQL 数据库的面试中,技术面试官经常会针对一些性能优化、数据库设计以及数据安全等方面提出问题。本文将就一些常见的 MySQL 面试问题进行解答,帮助你在面试中更加从容应对。


1. 联合索引的最左前缀原则怎么实现的? ​编辑

联合索引 (Composite Index)是由多个列组成的索引。MySQL 中有一个非常重要的优化原则,即 最左前缀原则 。这是指在查询时,如果查询条件中涉及的列顺序与联合索引的列顺序匹配,那么 MySQL 会根据索引的顺序依次使用索引进行查找。​编辑

实现方式

  • 联合索引只会按最左边的列开始进行匹配查询。即只有查询中包含索引的前缀列,索引才会生效。
  • 例如,如果有一个联合索引 (A, B, C),那么可以通过以下条件利用索引:
    • WHERE A = ?
    • WHERE A = ? AND B = ?
    • WHERE A = ? AND B = ? AND C = ?
  • 如果查询中没有包含最左边的列(如只包含 BC),则索引不会生效。

总结:使用联合索引时,需要根据索引的顺序在查询条件中尽可能包含最左侧的列。


2. 如何判断一个 SQL 语句走不走索引?explain ​编辑

要判断一个 SQL 语句是否使用了索引,可以使用 EXPLAIN 命令查看查询执行计划。EXPLAIN 命令提供了关于查询如何执行的详细信息,包括是否使用了索引。​编辑

使用方法​编辑

sql 复制代码
EXPLAIN SELECT * FROM table_name WHERE column_name = value;  

分析输出

  • key :显示查询使用了哪个索引。如果返回 NULL,表示没有使用索引。
  • type :显示连接类型,常见的类型有 ALL(全表扫描)、index(索引扫描)、range(范围扫描)等。ALL 表示全表扫描,意味着没有使用索引。
  • rows:估算查询扫描的行数。较大的行数通常意味着没有使用索引。

总结 :通过 EXPLAIN 可以查看查询是否走索引,以及索引的使用情况。​编辑


3. 遇到慢查询如何处理?

慢查询通常是由于查询没有使用索引或查询的表数据量过大。以下是处理慢查询的几个步骤:

  1. 启用慢查询日志

    在 MySQL 配置文件中启用慢查询日志,记录执行时间超过设定阈值的查询。
    sql SET GLOBAL slow_query_log = 'ON'; SET GLOBAL long_query_time = 2; -- 查询时间超过 2 秒会记录

  2. 使用 EXPLAIN 分析查询

    对慢查询使用 EXPLAIN 分析执行计划,查看是否使用了索引,是否存在全表扫描等。

  3. 优化查询

    • 增加索引 :根据查询条件和 EXPLAIN 结果,判断是否需要添加适当的索引。

    • 避免 SELECT * 查询 :只查询必要的字段,减少数据量。

    • 使用 LIMIT 限制返回行数:避免查询返回大量无用数据。

  4. 优化表结构

    • 定期优化数据库表(如使用 OPTIMIZE TABLE 命令)。

    • 确保表中没有过多的无用数据,定期清理过时记录。

总结 :通过启用慢查询日志和使用 EXPLAIN 命令分析,找出慢查询的瓶颈,并采取优化措施。​编辑


4. 数据库的三大范式

数据库设计的三大范式用于规范化数据库表结构,减少冗余数据,确保数据的一致性和完整性。

  1. 第一范式(1NF):要求每个列中的值都是原子值,不可再分。例如,不能在一个列中存储多个值。
  2. 第二范式(2NF):在满足 1NF 的基础上,要求表中的每个非主键列都完全依赖于主键。
  3. 第三范式(3NF):在满足 2NF 的基础上,要求表中的非主键列不依赖于其他非主键列。

总结:通过遵循这三大范式,可以保证数据的结构合理,避免冗余数据。


5. B 树与 B+ 树的区别

B 树和 B+ 树是数据库中常用的索引结构,它们的主要区别在于叶子节点的存储和查找方式:

  • B 树

    • 数据存储在叶子节点和非叶子节点中。

    • 查找过程可能会终止在非叶子节点。

    • 适合随机访问,但不适合范围查询。

  • B+ 树

    • 数据只存储在叶子节点,非叶子节点仅作为索引。

    • 所有叶子节点形成一个链表,适合范围查询。

    • 查找过程始终终止在叶子节点,增加了查询的效率。

总结:B+ 树的结构更加适合范围查询,且查找性能较好,因此大多数数据库使用 B+ 树作为索引结构。


6. 持久化

持久化是指将数据存储在数据库或文件系统中,确保即使系统崩溃,数据仍然可以恢复。在 MySQL 中,持久化通常通过 磁盘存储日志文件 来实现。

MySQL 提供了以下持久化方式:

  • 数据表存储:表数据被持久化到硬盘。
  • 日志文件:例如事务日志(binlog)和错误日志,保证即使在崩溃后也能恢复数据。

总结:MySQL 中的持久化机制确保数据在服务器崩溃或重启后能够得到恢复。


7. 数据库锁

MySQL 中的锁主要用于控制并发访问,保证数据的一致性和完整性。常见的锁有:​编辑

  1. 行锁:只锁定当前行,适合高并发场景,减少锁冲突。
  2. 表锁:锁住整张表,适合读写较少的场景,但会影响性能。
  3. 死锁:当两个事务互相等待对方释放锁时,产生死锁。MySQL 通过回滚其中一个事务来解决。

总结:锁是保证数据一致性的重要手段,合理选择行锁和表锁可以提高并发性能。

​编辑---

8. 如何防止 SQL 注入

防止 SQL 注入的最佳实践:

  • 使用预处理语句 :通过参数化查询(prepared statement)避免 SQL 注入。
    sql SELECT * FROM users WHERE username = ? AND password = ?;
  • 输入验证:对用户输入的数据进行验证,确保数据符合预期的格式。
  • 最小权限原则:数据库用户只授予必要的权限,避免 SQL 注入造成严重后果。

总结:使用预处理语句和输入验证是防止 SQL 注入的有效手段。


9. MVCC(多版本并发控制)

MVCC 是 MySQL InnoDB 存储引擎使用的一种并发控制机制,通过为每个事务提供数据的多个版本来提高并发性。MVCC 允许读取数据时不加锁,避免了长时间锁定导致的性能瓶颈。

总结:MVCC 提高了并发性能,通过保存数据的多个版本来支持并发读取和写入操作。


10. MySQL 主从复制

MySQL 主从复制是数据库的一个常见配置,用于将数据从一个主数据库复制到一个或多个从数据库。其工作原理如下:

  • 主数据库:执行写操作,将操作记录到二进制日志(binlog)。
  • 从数据库:从主数据库读取二进制日志并执行相同的操作。

总结 :MySQL 主从复制能够实现数据的备份和分布式读写负载均衡。​编辑


总结

本文详细解答了 MySQL 面试中的一些常见问题,包括索引、SQL 优化、数据库设计、锁机制以及数据安全等方面的内容。通过掌握这些基础知识,能够帮助你在 MySQL 面试中展示出良好的技术能力。

相关推荐
绝无仅有3 小时前
通过编写修复脚本修复 Docker 启动失败(二)
后端·面试·github
老K的Java兵器库3 小时前
并发集合踩坑现场:ConcurrentHashMap size() 阻塞、HashSet 并发 add 丢数据、Queue 伪共享
java·后端·spring
冷冷的菜哥4 小时前
go邮件发送——附件与图片显示
开发语言·后端·golang·邮件发送·smtp发送邮件
向葭奔赴♡4 小时前
Spring Boot 分模块:从数据库到前端接口
数据库·spring boot·后端
计算机毕业设计木哥4 小时前
计算机毕业设计选题推荐:基于SpringBoot和Vue的爱心公益网站
java·开发语言·vue.js·spring boot·后端·课程设计
Q741_1474 小时前
C++ 面试基础考点 模拟题 力扣 38. 外观数列 题解 每日一题
c++·算法·leetcode·面试·模拟
IT_陈寒4 小时前
Redis 性能翻倍的 5 个隐藏技巧,99% 的开发者都不知道第3点!
前端·人工智能·后端
JaguarJack4 小时前
PHP 桌面端框架NativePHP for Desktop v2 发布!
后端·php·laravel
自由的疯4 小时前
Java 怎么学习Kubernetes
java·后端·架构