Mysql面试合集

概念

是一个开源的关系型数据库。

数据库事务及其特性

事务:是一系列的数据库操作,是数据库应用的基本逻辑单位。

事务特性:

(1)原子性:即不可分割性,事务要么全部被执行,要么就全部不被执行。

(2)一致性。事务的执行使得数据库从一种正确状态转换成另一种正确状态

(3)隔离性。在事务正确提交之前,不允许把该事务对数据的任何改变提供给任何其他事务,

(4) 持久性。事务正确提交后,其结果将永久保存在数据库中,即使在事务提交后有了其他故障,事务的处理结果也会得到保存。

数据库三范式

第一范式(1NF)无重复的列(原子性)

第二范式(2NF)属性完全依赖于主键

第三范式(3NF)属性不依赖于其它非主属性

sql语句在mysql中的执行过程

客户端发起sql请求,与MySQL服务器建立连接,如果是select会先查询缓存(mysql8删除),没有命中缓存进入分析器,解析处理,更新前记录下log,用于事务回滚。然后判断记录是否存在缓冲池中,查询存在直接返回,更新存在判断存在冲突。最后提交事务。

常见优化方式

a. 设计良好的数据库结构,允许部分数据冗余,尽量避免join查询,提高效率。
b. 选择合适的表字段数据类型和存储引擎,适当的添加索引。
c. mysql库主从读写分离。
d. 找规律分表,减少单表中的数据量提高查询速度。
e. 添加缓存机制,比如memcached,apc等。
f. 不经常改动的页面,生成静态页面。
g. 书写高效率的SQL。比如 SELECT * FROM TABEL 改为 SELECT field_1, field_2, field_3 FROM TABLE.

mysql事务隔离级别

1、串行读 (Serializable)

2、可重复读 (RR默认)

确保同一事务的多个实例并发读取数据时,会看到同样的数据行,解决了不可重复读的问题。

3、读已提交 (RC)

一个事务只能看见已经提交事务所做的改变。可避免脏读的发生。

4、读未提交 (Read uncommitted)

所有事务都可以看到其他未提交事务的执行结果。

脏读:读到了脏数据,即无效数据。
不可重复读:是指在数据库访问中,一个事务内的多次相同查询却返回了不同数据。
幻读:指同一个事务内多次查询返回的结果集不一样,比如增加了行记录。
  • 脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据。
  • 不可重复读是指在对于数据库中的某行记录,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,另一个事务修改了数据并提交了。
  • 幻读是当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录。对幻读的正确理解是一个事务内的读取操作的结论不能支撑之后业务的执行。假设事务要新增一条记录,主键为id,在新增之前执行了select,没有发现id为xxx的记录,但插入时出现主键冲突,这就属于幻读,读取不到记录却发现主键冲突是因为记录实际上已经被其他的事务插入了,但当前事务不可见。
  • 不可重复读和脏读的区别是,脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据。

innodb和myisam的区别?

InnoDB支持行锁、事务处理、外键、安全恢复,MyISAM不支持

InnoDB必须有主键,MyISAM可以没有

建立索引需要考虑什么?

1、选择合适的字段建立索引

根据查询频率(如姓名、日期),设置索引。字段大量重复、为空不适合建立索引。
尽量找那种占用空间小的类型字段做索引,长字符串可以使用前缀索引,减少索引大小,提高查询速度。

2、多个经常查询列可以建立联合索引

遵循向左原则。

3、避免过度索引和频繁更新索引字段

占用磁盘空间、需要频繁维护字段,浪费性能。

4、SQL优化慢查询

//使用 show processlist
//观察是否有大量线程处于不正常的状态或者特征//使用 explain(desc) 分析单条SQL语句

一般做到range,极好做到ref,ALL全表扫描不推荐

image.png

如何MySQL和ES一致性?

1、操作MYSQL时同步操作ES,这种不推荐,因为重试逻辑嵌在业务代码中,服务宕机,写入失败会一直重试。

2、通过binlog进行同步,客户端从canal拉取消息进行消费,再由客户端主动插入或者更新ES中的数据。也可以cannal发送binlog消息到消息队列,client异步消费kafka中的消息。

b+树是如何实现的 优势在哪

B树也称B-树,它是一颗多路平衡查找树,B树和后面讲到的B+树也是从最简单的二叉树变换而来的,并没有什么神秘的地方,下面我们来看看B树的定义。

  • 每个节点中的关键字都按照从小到大的顺序排列,每个关键字的左子树中的所有关键字都小于它,而右子树中的所有关键字都大于它。
  • 所有叶子节点都位于同一层,或者说根节点到每个叶子节点的长度都相同。
  • 每个节点都存有索引和数据,也就是对应的key和value。

B树和B+树的区别在于,B+树的非叶子结点只包含导航信息,不包含实际的值,每个叶子结点都存有相邻叶子结点的指针叶子结点本身依关键字的大小自小而大顺序链接,便于区间查找和遍历。

  • 由于B+树在内部节点上不包含数据信息,因此在内存页中能够存放更多的key。 数据存放的更加紧密,具有更好的空间局部性。因此访问叶子节点上关联的数据也具有更好的缓存命中率。
  • B+树的叶子结点都是相链的,因此对整棵树的便利只需要一次线性遍历叶子结点即可。而且由于数据顺序排列并且相连,所以便于区间查找和搜索。而B树则需要进行每一层的递归遍历。相邻的元素可能在内存中不相邻,所以缓存命中性没有B+树好。

MySQL悲观锁

在查询库存时加排它锁,阻止其他事务对这条数据进行加锁或者修改

优点:MySQL事物锁准确度高。缺点:耗性能,对MySQL压力较大。

DB::beginTransaction();try {$stock = Skill::query()->where('id', $id)->lockForUpdate()->value('stock');if ($stock > 0) {Skill::query()->where('id', $id)->decrement('stock');echo '抢购成功';} else {echo '库存不足,抢购失败';}DB::commit();} catch (\Exception $e) {echo $e->getMessage();DB::rollBack();}

MySQL乐观锁

不加锁实现锁效果,MySQL乐观锁就是MVCC机制,借助version版本号进行控制

优点:因为不涉及锁数据,并发量比悲观锁。缺点:MySQL抗压瓶颈。

$info = Skill::query()->where('id', $id)->first(['stock', 'version']);
if ($info->stock > 0) {$skill = Skill::query()->where(['id' => $id, 'version' => $info->version])->update(['stock' => $info->stock -1, 'version' => $info->version + 1]);echo '抢购成功';
} else {echo '库存不足,抢购失败';
}

MVCC:多版本并发控制。在MySQL InnoDB 中的实现主要是为了提高数据库并发性能,用更好的方式去处理读-写冲突,做到即使有读写冲突时,也能做到不加锁,非阻塞并发读。

当前读:读取的是记录的最新版本,读取时会保证其他并发事务不能修改当前记录,会对读取的记录进行加锁。

快照读:不加锁的非阻塞读。

持续更新,未完待续~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/38890.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录1数组

1 二分查找 Leetcode704 1 [l,r]区间 l 0, r nums.length-1; while(l<r) 因为lr有意义 2 [l,r)区间 l 0, r nums.length; while(l<r) Leetcode35 class Solution {public int searchInsert(int[] nums, int target) {int l0,rnums.length;while(l<r){int m l(…

使用设计模式来增强你的 SpringBoot 开发

SpringBoot 是一个出色的框架&#xff0c;可以快速构建强大而高效的应用程序。但你是否知道设计模式可以将 SpringBoot 开发提升到一个新的水平&#xff1f; • 设计模式的重要性&#xff1a;了解设计模式如何促进代码的可重用性、可维护性和整体应用程序健康。 • SpringBoot…

在Spring Data JPA中使用@Query注解

目录 前言示例简单示例只查询部分字段&#xff0c;映射到一个实体类中只查询部分字段时&#xff0c;也可以使用List<Object[]>接收返回值再复杂一些 前言 在以往写过几篇spring data jpa相关的文章&#xff0c;分别是 Spring Data JPA 使用JpaSpecificationExecutor实现…

python 笔试面试八股(自用版~)

1 解释型和编译型语言的区别 解释是翻译一句执行一句&#xff0c;更灵活&#xff0c;eg&#xff1a;python; 解释成机器能理解的指令&#xff0c;而不是二进制码 编译是整个源程序编译成机器可以直接执行的二进制可运行的程序&#xff0c;再运行这个程序 比如c 2 简述下 Pyth…

运维锅总详解RocketMQ

本文尝试从Apache RocketMQ的简介、主要组件及其作用、3种部署模式、Controller集群模式工作流程、最佳实践等方面对其进行详细分析。希望对您有所帮助&#xff01; 一、Apache RocketMQ 简介 Apache RocketMQ 是一个开源的分布式消息中间件&#xff0c;由阿里巴巴集团开发并…

祝贺《华为战略管理法:DSTE实战体系》被《中国企业家》杂志评为企业家枕边书50本之一(宏观战略类书籍)

祝贺《华为战略管理法&#xff1a;DSTE实战体系》被《中国企业家》杂志评为企业家枕边书50本之一 2024年4月23日&#xff08;周二&#xff09;下午13:00&#xff0c;《中国企业家》杂志如期举办“每天都是读书日”线下活动。 《中国企业家》杂志携手商界大咖共同推选50本枕边书…

Vue.js中的计算属性

Vue.js中的计算属性&#xff08;computed properties&#xff09;是用于声明响应式依赖的属性。它们会根据它们的依赖进行缓存&#xff0c;并且只有在相关依赖发生改变时才会重新求值。这使得它们非常适合用来处理复杂逻辑和数据处理。 基本用法 在Vue实例中&#xff0c;可以…

镭速实现AD域集成助力企业文件安全传输管控

在当今这个信息量爆炸扩张的年代&#xff0c;企业数据宛如一座蕴藏无限价值的宝库&#xff0c;它不仅是企业核心竞争力的载体&#xff0c;也成为了各种潜在风险的聚焦点。随着数字化转型步伐的加快&#xff0c;安全文件传输的管理控制显得尤为重要&#xff0c;它构成了保护企业…

各类排序方法 归并排序 扩展练习 逆序对数量

七月挑战一个月重刷完Y总算法基础题&#xff0c;并且每道题写详细题解 进度:(3/106) 归并排序的思想也是分而治之 归并优点&#xff1a;速度稳定,排序也稳定 排序也稳定&#xff08;数组中有两个一样的值&#xff0c;排序之后他们的前后顺序不发生变化&#xff0c;我们就说…

Leetcode 2065. 最大化一张图中的路径价值(DFS / 最短路)

Leetcode 2065. 最大化一张图中的路径价值 暴力DFS 容易想到&#xff0c;从0点出发DFS&#xff0c;期间维护已经走过的距离&#xff08;时间&#xff09;和途径点的权值之和&#xff0c;若访问到0点则更新答案&#xff0c;若下一步的距离与已走过的距离和超出了maxTime&#…

oracle sql语句 排序 fjd = ‘0101‘ 排在 fjd = ‘0103‘ 的前面

要实现这个排序需求&#xff0c;你可以使用 CASE 表达式来自定义排序逻辑。假设你有一个表格名为 your_table&#xff0c;并且有一个字段 fjd 存储类似 ‘0101’, ‘0103’ 这样的值&#xff0c;你可以这样编写 SQL 查询&#xff1a; SELECT * FROM your_table ORDER BY CASE …

专题六:Spring源码之初始化容器BeanFactory

上一篇咱们通过一个例子介绍初始化容器上下文相关内容&#xff0c;并通过两个示例代码看到了Spring在设计阶段为我预留的扩展点&#xff0c;和我们应该如何利用这两个扩展点在Spring初始化容器上下文阶段为我们提供服务。这一篇咱们接着往下看。 老这样子下回到refresh方法上来…

第55期:MySQL 频繁 Crash 怎么办?

社区王牌专栏《一问一实验&#xff1a;AI 版》全新改版归来&#xff0c;得到了新老读者们的关注。其中不乏对 ChatDBA 感兴趣的读者前来咨询&#xff0c;表达了想试用体验 ChatDBA 的意愿&#xff0c;对此我们表示感谢 &#x1f91f;。 目前&#xff0c;ChatDBA 还在最后的准备…

MSVCR120.DLL丢失的多种修复方法,助你快速解决dll问题

在日常生活和工作中&#xff0c;电脑已经成为我们不可或缺的工具。然而&#xff0c;在使用电脑的过程中&#xff0c;我们常常会遇到一些问题&#xff0c;其中之一就是电脑运行软件时提示找不到msvcr120.dll。如果该文件缺失或损坏&#xff0c;可能会导致依赖它的应用程序无法启…

高优先线程

你开发的时候有么有遇到过一个问题&#xff1a;服务器的一个服务线程过几个小时断连一次&#xff0c;断连之后会马上重连这种情况。这是由于CPU负载较高,线程调度时将处理数据的线程挂起了一段时间导致的。 因此&#xff0c;我有考虑到把cpu的核心进行分散开来&#xff0c;就类…

CesiumJS【Basic】- #042 绘制纹理线(Primitive方式)

文章目录 绘制纹理线(Primitive方式)1 目标2 代码2.1 main.ts3 资源文件绘制纹理线(Primitive方式) 1 目标 使用Primitive方式绘制纹理线 2 代码 2.1 main.ts var start = Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883);var

【剑指Offer系列】68-二叉树的最近公共祖先(哈希)

思路&#xff1a;使用map存储每个节点的父节点&#xff0c;则两个节点的最近公共祖先&#xff0c;即二者的最近父节点 1、中序遍历二叉树&#xff08;当前节点的下一个节点&#xff09; 2、记录每个节点的父节点 3、列出p的族谱、q的族谱 4、寻找二者最近的祖先 class Soluti…

微信小程序毕业设计-英语互助系统项目开发实战(附源码+论文)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;微信小程序毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计…

PS系统教程31

调色之色阶 调色与通道最基本的关系通道是记录颜色最基本的信息有些图片可以用通道去改变颜色信息的说明这些图像是比较高级的PS是一款图像合成软件&#xff0c;在合成过程中需要处理大量素材&#xff0c;比如要用这些素材进行抠背景&#xff0c;就要用到图层蒙版以及Alpha通道…

Qt编程技巧总结篇(2)-信号-槽-多线程(一)

文章目录 Qt编程技巧总结篇&#xff08;2&#xff09;-信号-槽-多线程&#xff08;一&#xff09;信号与槽实例与应用 小结 Qt编程技巧总结篇&#xff08;2&#xff09;-信号-槽-多线程&#xff08;一&#xff09; 最近学习信号与槽以及多线程&#xff0c;非常有技术含量&#…