每日速记10道MySQL面试题16

其他资料

每日速记10道java面试题01-CSDN博客

每日速记10道java面试题02-CSDN博客

每日速记10道java面试题03-CSDN博客

每日速记10道java面试题04-CSDN博客

每日速记10道java面试题05-CSDN博客

每日速记10道java面试题06-CSDN博客

每日速记10道java面试题07-CSDN博客

每日速记10道java面试题08-CSDN博客

每日速记10道java面试题09-CSDN博客

每日速记10道java面试题10-CSDN博客

每日速记10道java面试题11-CSDN博客

每日速记10道java面试题12-CSDN博客

每日速记10道java面试题13-MySQL篇-CSDN博客

每日速记10道java面试题14-MySQL篇-CSDN博客

每日速记10道java面试题15-MySQL篇-CSDN博客

目录

1.如何在MySQL中避免单点故障?/如何实现读写分离?

2.如何处理MySQL的主从同步延迟?

3.什么是分库分表?分库分表有哪些策略?

4.对数据库分库分表会产生哪些问题?

[5.从 MySQL获取数据,是从磁盘读取的吗?](#5.从 MySQL获取数据,是从磁盘读取的吗?)

[6.MySQL 的 Doublewrite Buffer 是什么?它有什么作用?](#6.MySQL 的 Doublewrite Buffer 是什么?它有什么作用?)

[7.什么是MySQL的Log buffer?](#7.什么是MySQL的Log buffer?)

8.为什么在数据库中都是不推荐使用多表JOIN?

[9.MySQL 中 DELETE、DROP 和 TRUNCATE 的区别是什么?](#9.MySQL 中 DELETE、DROP 和 TRUNCATE 的区别是什么?)

[10.MySQL中INNER JOIN、LEFT JOIN 和 RIGHT JOIN 的区别是什么?](#10.MySQL中INNER JOIN、LEFT JOIN 和 RIGHT JOIN 的区别是什么?)


1.如何在MySQL中避免单点故障?/如何实现读写分离?

一般会使用主从架构的形式,主数据库+从数据库,读操作只在从数据库中读,写操作往主数据库中写,写完之后再数据同步到从数据库,当主数据库崩了之后,就让从数据库顶上来,读写操作都由从数据库承担,等到主数据库恢复了之后,再将从数据库中的数据同步到主数据库并恢复读写分离。

2.如何处理MySQL的主从同步延迟?

主从同步延迟就是主数据库和从数据库之间的数据同步存在时间差,导致从数据库的数据落后于主数据库。这种延迟是必然存在的,我们无法避免,只能尽量减少。

我能想到比较好的两点方案能够尽量减少主从同步延迟:

第一点就是关键业务的读写都走主数据库,比如用户注册这种比较重要的,这样用户登录进来就不会说账号不存在等问题。

第二点就是设置缓存,在主库写入之后同步到缓存,这样每次查询就先查缓存,缓存没有再查数据库,但是这样又会出现缓存数据不一致的问题。

3.什么是分库分表?分库分表有哪些策略?

什么是分库分表:

将数据进行拆分,放到不同的数据库或者表中

分库分表的类型(策略):水平分表,垂直分表,垂直分库,水平分库

水平分表:将一个表按行进行拆分,分成多行,放到不同的表中(表数据太多了,分一点到其他表)

垂直分表:将一个表按列进行拆分,分成多列,放到不同的表中(表字段太多了,分一点到其他表)

水平分库:不同的库可以具有相同的表结构,只不过每个表里面的数据不一样。

垂直分库:根据功能或者模块进行分库,不同的库存储不同功能或模块的数据,例如用户模块,订单模块,一个搞一个数据库。

水平分库比垂直分库维护起来更加的困难,跨库查询更加的复杂。

为什么要分库分表:业务发展需要,用户以及数据越来越多,单库单表抗不住压力,性能差。分库分表,能够提升性能。

4.对数据库分库分表会产生哪些问题?

1.事务问题。单机事务用不上,得使用分布式事务,而分布式事务大多只能保证数据的最终一致性,所以可能存在数据不一致的场景

2.分库之后,不同库里面的表不能进行ioin查询。一般在应用层进行外理,可以先查出一个表里面的数据,然后根据这些数据做一些处理之后,去查另一个库里面的表,最后进行整合,得到最终结果。还可以在表里面存储一些冗余数据,避免连表查询。

3.主键id重复问题。主键id在分库分表之后,可能存在重复的情况,可以使用雪花算法或者分布式唯一id生成器来生成。

4.order by和count问题。分库分表后,order by,count无法通过数据库直接实现。可以通过应用层代码实现。

这里可能会被问到分布式事务、分布式唯一id生成器等问题

5.从 MySQL获取数据,是从磁盘读取的吗?

并不总是从磁盘读取。mysql8.0之前有查询缓存,会先去查询缓存里面找,如果查询缓存里面有的话,直接返回。8.0的时候移除了查询缓存,因为命中率低,它是以sql作为key,sql语句要相同,而且表不能发生任何变化,才能命中。还有个buffer pool,里面存储了一个一个的数据页,mysql会从buffer pool里面找,如果找到的话就会返回。

6.MySQL 的 Doublewrite Buffer 是什么?它有什么作用?

MySQL 的 Doublewrite Bufer 是 InnoDB存储引擎中的一个机制,用于确保数据的安全性和一致性。它的作用是将数据先写入一个内存缓冲区(双写缓冲区),然后再将其写入数据文件。这种方式可以防止在写入过程中因崩溃或故障导致数据损坏,确保数据的一致性和完整性。

工作原理简述:

写入流程:当事务提交时,InnoDB 首先将数据写入 Doublewrite Buffer,再从该缓冲区将数据写入磁盘的实际数据文件。

恢复机制:在崩溃恢复时,InnoDB 会使用 Doublewrite Buffer 中的数据来修复损坏的页,保证教据不丢失。

延伸→那如果在写入Buffer的时候就出问题了怎么办?

这个问题我没深入研究过,我觉得InnoDB引擎在底层应该会对这次操作进行再次执行并重试写入Buffer中。

7.什么是MySQL的Log buffer?

详情请跳转我的另一篇文章:MySQL数据表中的InnoDB引擎原理(存储结构+架构+事务原理+MVCC)_mysql innodb存储引擎实现原理-CSDN博客

8.为什么在数据库中都是不推荐使用多表JOIN?

多表 JOIN 可能导致查询性能下降,尤其是在处理大数据集时,JOIN 操作的计算复杂度会显著增加,需要进行大量的数据扫描和匹配,增加了内存和CPU的消耗,导致响应时间变长。数据量小倒数据库往往是我们系统的弱点,很多情况下性能瓶颈都在数据库,因此我们需要尽量避免把压力放在数据库上。

如果实在要JOIN,尽量值JOIN两张表,三表以上不JOIN,太耗性能了。JOIN的时候尽量小表做驱动表,因为驱动表要全表扫描,被驱动表走索引,整体复杂度是A+2log2B*A(A为驱动表,B为被驱动表),所以尽量让A尽量小。

9.MySQL 中 DELETE、DROP 和 TRUNCATE 的区别是什么?

1.Delete 用于删除行数据,但保留表结构和相关的对象。

2.Drop 用于完全删除数据库表,包括数据和结构。

3.Truncate只删除数据,不会删除表结构和索引等其他结构。

10.MySQL中INNER JOIN、LEFT JOIN 和 RIGHT JOIN 的区别是什么?

inner join 内连接:内连接就是返回两张表都关联上的数据

left join 左连接:返回时保留左表的数据,右表关联不上的会显示null值

right join 右连接:返回时保留右表的数据,左表关联不上的会显示null值

相关推荐
m0_748240547 分钟前
WebView2教程(基于C++)【一】环境初始化
开发语言·c++
●VON13 分钟前
go语言的成神之路-标准库篇-os标准库
linux·运维·服务器·开发语言·后端·学习·golang
一只拉古14 分钟前
后端编程大师之路:在 .NET 应用中使用 ElasticSearch 和 Kibana 进行日志管理
后端·elasticsearch·架构
不爱运动的跑者20 分钟前
关于Python程序消费Kafka消息不稳定问题的处理方法
开发语言·python·kafka
代码写着写着就会了20 分钟前
pycharm添加虚拟环境时提示没有Python打包工具
开发语言·python·pycharm
小屁孩大帅-杨一凡21 分钟前
python实现文件夹打包成jar
java·开发语言·python·pycharm·jar
清风 00122 分钟前
一、使用 mdadm 工具在 Ubuntu 上创建 RAID 1(镜像)
运维·服务器·数据库
道斯31 分钟前
asp.net老项目运维,出现的问题6之数据库
数据库
zxrhhm31 分钟前
Oracle PL/SQL编程中批量数据处理Sparse Collections and SQL%BULK_EXCEPTIONS
数据库·oracle
易和安38 分钟前
JS进阶DAY5|JS执行机制
开发语言·javascript·ecmascript