面试数据库八股文十问十答第八期

面试数据库八股文十问十答第八期

作者:程序员小白条个人博客

相信看了本文后,对你的面试是有一定帮助的!关注专栏后就能收到持续更新!

⭐点赞⭐收藏⭐不迷路!⭐

1)MySQL 锁类型

MySQL 中常见的锁类型包括:

  • 行级锁(Row-Level Locks):在行级别进行加锁,使得其他事务无法修改或删除已锁定的行。MySQL 使用的是一种称为多版本并发控制(MVCC)的行级锁。
  • 表级锁(Table-Level Locks):在整个表上进行锁定,限制其他事务对整个表的访问。这种锁定级别一般会导致并发性能下降,因为它会阻止其他事务对表的读写操作。
  • 页级锁(Page-Level Locks):在数据页级别进行加锁,这是一种介于行级锁和表级锁之间的锁定级别。不过,MySQL InnoDB 存储引擎并不直接支持页级锁。
  • 意向锁(Intention Locks):用于表锁定时,通知其他事务该表即将被加锁的类型,以避免死锁情况的发生。

2)乐观锁和悲观锁的区别

  • 悲观锁:在操作数据时,认为其他事务可能会修改数据,因此在操作之前会先对数据进行加锁,确保在整个事务过程中数据不会被其他事务修改。例如,在读取数据时,会加上排他锁,防止其他事务修改数据,直到当前事务释放锁为止。
  • 乐观锁:相对于悲观锁,乐观锁假设在整个事务过程中数据不会被其他事务修改,因此不会在操作之前对数据进行加锁。而是在提交事务时,会检查数据是否被其他事务修改过。如果没有,则提交成功;如果发现数据已经被修改,就会执行回滚操作,让用户决定如何处理。

3)解决死锁的方法

解决死锁的方法通常包括以下几种:

  • 超时机制:设置事务超时时间,在超时后自动回滚事务,避免死锁长时间占用资源。
  • 死锁检测和回滚:MySQL 会自动检测死锁,并选择一个事务进行回滚,解除死锁。
  • 优化事务:合理设计事务,尽量减少事务持有锁的时间,降低死锁的概率。
  • 锁定对象顺序:通过按照统一的顺序对数据库对象进行加锁,可以减少死锁的发生。例如,始终按照相同的顺序对表进行加锁,可以避免由于不同的事务加锁顺序不一致而导致的死锁。
  • 重试机制:当发生死锁时,通过重试事务的方式,重新执行事务,直到成功为止。

4)使用 EXPLAIN 分析查询语句

EXPLAIN 是 MySQL 提供的一个关键词,用于分析 SELECT 查询语句的执行计划。通过 EXPLAIN 关键词,可以查看 MySQL 是如何执行查询语句的,以及使用了哪些索引、表连接方式等信息。

分析查询语句的步骤通常如下:

  1. 使用 EXPLAIN 关键词加上要分析的查询语句,例如:EXPLAIN SELECT * FROM table_name WHERE condition;
  2. 查看 EXPLAIN 的输出结果,包括 idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra 等字段,这些字段提供了查询执行计划的详细信息。
  3. 根据输出结果,分析查询语句的执行计划,判断是否需要优化查询语句或者添加索引等操作。

5)count(*)count(1)count(字段名) 的区别

  • count(*):统计表中所有行的数量,包括 NULL 值行。
  • count(1):统计所有行中非 NULL 值的行数,因为传递给 COUNT 函数的参数是常量,所以实际上并不会统计任何具体的列值,而是简单地统计行的数量。
  • count(字段名):统计指定字段中非 NULL 值的行数。

在实际使用中,一般情况下这三种形式的效率差异不大,但在特定情况下可能会有微小的性能差异。

6)int(11) 中的数字 11 的含义

int(11) 中的数字 11 代表了字段的显示宽度,并不代表存储的数据大小或者范围。在 MySQL 中,int 类型的字段默认显示宽度是 11,这只是一种指定数据显示宽度的方式,不影响存储大小或者数据范围。因此,int(11)int(20) 存储的数据范围是相同的,只是显示宽度不同而已。这个数字在大多数情况下只是用于控制客户端显示的格式,并不影响实际存储或计算。

7)varcharchar 的区别

  • char
    • char 是一种固定长度的字符串类型。
    • 存储时会按照指定的长度进行存储,如果存储的字符串长度小于指定长度,会用空格进行填充。
    • 例如,char(10) 指定了长度为 10 的字符串,无论存储的实际字符串长度是多少,都会占用 10 个字符的存储空间。
  • varchar
    • varchar 是一种可变长度的字符串类型。
    • 存储时只占用实际字符串长度加上一个字节(用于存储长度信息)的存储空间。
    • 例如,varchar(10) 指定了最大长度为 10 的字符串,如果存储的实际字符串长度为 5,则只占用 6 个字符的存储空间。

8)SQL 调优的一般方法

SQL 调优是数据库性能优化的一个重要方面,一般的方法包括但不限于:

  • 分析查询语句:使用 EXPLAIN 分析查询执行计划,查看是否使用了索引、是否进行了全表扫描等。
  • 优化查询语句:修改查询语句结构,避免复杂的连接或子查询,使用更有效的查询方式。
  • 使用索引:根据查询的字段和条件使用合适的索引,避免全表扫描。
  • 优化表结构:合理设计表结构,避免过多冗余字段,规范化数据库结构。
  • 性能测试:通过性能测试工具或者监控工具,对查询性能进行评估和优化。

9)MySQL 数据的排序实现方式

MySQL 使用多种方式来实现数据排序,主要取决于查询中使用的排序字段和索引情况:

  • 使用索引排序:如果查询中使用的排序字段有合适的索引,MySQL 可以使用索引来进行排序,这样可以加速排序操作。
  • 使用文件排序:如果没有合适的索引可用,MySQL 将使用文件排序。它会将结果集存储在临时文件中,并进行排序操作。
  • 排序算法:MySQL 使用多种排序算法,包括快速排序、合并排序等,具体选择算法的方式取决于数据量和版本。

10)MySQL 避免单点故障问题的方法

为了避免 MySQL 单点故障问题,一般会采取以下措施:

  • 使用主从复制:配置主从复制,将读操作分散到多个数据库实例,同时也提高了故障恢复能力。
  • 使用数据库集群:通过配置数据库集群,将数据分散到多个节点上,提高了数据库的可用性和扩展性。
  • 使用数据库代理:通过数据库代理软件如 MySQL Router 或 ProxySQL,将请求分发到多个数据库服务器上。
  • 备份与恢复策略:建立定期的备份和恢复策略,确保在主节点故障时可以快速切换到备用节点。
  • 硬件负载均衡:使用负载均衡器将请求均衡分配到多个数据库服务器上,防止单个节点过载或故障。

这些方法结合起来可以有效地提高 MySQL 数据库的可用性和稳定性,避免因为单点故障而导致的系统中断或性能下降问题。

开源项目地址:https://gitee.com/falle22222n-leaves/vue_-book-manage-system

前后端总计已经 1300+ Star,2W+ 访问!

⭐点赞⭐收藏⭐不迷路!⭐

  • 27
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员小白条

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值