面试数据库MySQL 99% 必问的十道题及详细解答

1. 唯一索引比普通索引快吗?为什么?​编辑

回答

唯一索引比普通索引稍微快一些,因为它具有唯一性约束,能避免重复数据的插入,导致查找数据时,索引的结构可以更加优化。对于唯一索引,它不仅能用于查找数据,还能保证数据唯一性。而普通索引仅仅用来加速查询,没有唯一性约束。

2. MySQL 由哪些部分组成?分别用来做什么?​编辑

回答

MySQL 主要由以下几个部分组成:

  • 客户端:发送 SQL 查询到 MySQL 服务器。
  • 查询解析器(Query Parser):解析客户端请求的 SQL 语句。
  • 查询优化器(Query Optimizer):优化 SQL 执行计划,选择最优的执行路径。
  • 查询执行器(Query Executor):实际执行查询,并返回查询结果。
  • 存储引擎(Storage Engine):负责数据存储和管理(如 InnoDB、MyISAM 等)。
  • 事务管理器(Transaction Manager):负责事务的管理,保证事务的一致性和隔离性。

3. MySQL 查询缓存有什么弊端?应该什么情况下使用?8.0 版本对查询缓存有什么变更?​编辑

回答

  • 弊端

    • 查询缓存对于动态更新的表不适用,因为每次数据发生变化,缓存都会失效。

    • 对于大表或者高并发应用,查询缓存可能导致性能下降。

  • 使用场景

    • 查询缓存适用于读多写少的场景,尤其是数据库中查询频繁且结果固定的情况。
  • 8.0 版本变更

    • 在 MySQL 8.0 版本中,查询缓存已经被完全移除,所有缓存操作被迁移到其他机制中,如 InnoDB 缓存池等。

4. MyISAM 和 InnoDB 的区别有哪些?

回答

  • MyISAM
    • 不支持事务
    • 不支持外键
    • 表锁定(表级锁)
    • 查询速度较快,适合只读应用
  • InnoDB
    • 支持事务
    • 支持外键
    • 行级锁
    • 支持崩溃恢复
    • 适合需要高并发、数据一致性的应用

5. MySQL 怎么恢复半个月前的数据?

回答

可以通过以下几种方式恢复:

  • 通过备份恢复:定期备份 MySQL 数据,可以从备份中恢复数据。
  • 通过 binlog 恢复 :如果启用了 binlog 日志,可以通过分析 binlog 日志恢复到某个时间点的数据。
    bash mysqlbinlog --start-datetime="YYYY-MM-DD HH:MM:SS" --stop-datetime="YYYY-MM-DD HH:MM:SS" binlog.000001 | mysql -u root -p

6. MySQL 事务的隔离级别,分别有什么特点?

回答

MySQL 事务有四种隔离级别:

  1. READ UNCOMMITTED:允许读取未提交的数据,可能出现脏读。
  2. READ COMMITTED:只读取已提交的数据,避免脏读,但可能出现不可重复读。
  3. REPEATABLE READ:读取时锁定数据,避免不可重复读,但可能出现幻读。
  4. SERIALIZABLE:完全串行化,避免脏读、不可重复读和幻读,性能较差。

7. 做过哪些 MySQL 索引相关优化?

回答

  • 合理选择索引类型:根据查询需求选择合适的索引类型(B+树索引、哈希索引等)。
  • 避免过多索引:过多的索引会影响写入性能,可以根据查询的实际情况优化索引。
  • 使用联合索引:对于复合查询,使用联合索引比单一索引效果更好。
  • 优化索引列的顺序:将高选择性的列放在前面,减少索引扫描的范围。

8. 简要说一下数据库范式?

回答

数据库范式是为了减少冗余数据和提高数据一致性,常见的有以下几种:

  1. 第一范式(1NF):数据表中的每一列都是原子值,不允许有重复的列。
  2. 第二范式(2NF):满足 1NF,且每个非主属性完全依赖于主键。
  3. 第三范式(3NF):满足 2NF,且没有传递依赖。
  4. BCNF :满足 3NF,但消除了所有的函数依赖。

9. 一千万条数据的表,如何分页查询?

回答

可以使用 LIMITOFFSET 来进行分页查询。例如:

sql 复制代码
SELECT * FROM table LIMIT 1000 OFFSET 2000;  

不过当数据量非常大时,性能会下降。可以考虑:

  • 使用 主键 ID 分页:如通过 ID 或其他有序列的字段进行分页查询。
  • 覆盖索引:使用索引覆盖查询减少磁盘 I/O。

10. 订单表数据量越来越大导致查询缓慢,如何处理?

回答

  • 分区表:将订单表按日期、地区等字段进行分区,可以大大提高查询效率。
  • 优化索引:为常用的查询字段添加合适的索引。
  • 表优化 :定期进行表的优化(如 OPTIMIZE TABLE),清理过时的数据。
  • 水平切分:将数据拆分到多个表或数据库中。

这些问题是 MySQL 面试中常见的问题,了解并掌握这些知识对于提高 MySQL 性能和解决实际问题非常有帮助。

相关推荐
焗猪扒饭13 小时前
redis stream用作消息队列极速入门
redis·后端·go
树獭非懒13 小时前
AI大模型小白手册|Embedding 与向量数据库
后端·python·llm
sunny_14 小时前
面试踩大坑!同一段 Node.js 代码,CJS 和 ESM 的执行顺序居然是反的?!99% 的人都答错了
前端·面试·node.js
ayqy贾杰16 小时前
Agent First Engineering
前端·vue.js·面试
IT_陈寒16 小时前
SpringBoot实战:5个让你的API性能翻倍的隐藏技巧
前端·人工智能·后端
有道AI情报局16 小时前
网易有道龙虾 NAS 服务器部署与实战指南
github
梦想很大很大17 小时前
拒绝“盲猜式”调优:在 Go Gin 项目中落地 OpenTelemetry 链路追踪
运维·后端·go
唐叔在学习17 小时前
就算没有服务器,我照样能够同步数据
后端·python·程序员
用户685453759776918 小时前
同步成本换并行度:多线程、协程、分片、MapReduce 怎么选才不踩坑
后端