每日速记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值

相关推荐
秋野酱几秒前
基于javaweb的SpringBoot爱游旅行平台设计和实现(源码+文档+部署讲解)
java·spring boot·后端
饕餮争锋12 分钟前
org.slf4j.MDC介绍-笔记
java·开发语言·笔记
shane-u15 分钟前
Maven私服搭建与登录全攻略
java·maven
半部论语15 分钟前
jdk多版本切换,通过 maven 指定编译jdk版本不生效,解决思路
java·开发语言·maven·intellij-idea
阿沁QWQ17 分钟前
单例模式的两种设计
开发语言·c++·单例模式
小明.杨17 分钟前
Django 中时区的理解
后端·python·django
有梦想的攻城狮20 分钟前
spring中的@Async注解详解
java·后端·spring·异步·async注解
5283020 分钟前
MySQL主从复制
数据库·mysql
Python ml25 分钟前
Tomcat与纯 Java Socket 实现远程通信的区别
java·开发语言·tomcat
qq_124987075328 分钟前
原生小程序+springboot+vue医院医患纠纷管理系统的设计与开发(程序+论文+讲解+安装+售后)
java·数据库·spring boot·后端·小程序·毕业设计