mysql知识面试day2

news/2025/2/27 15:19:58/文章来源:https://www.cnblogs.com/tdsmomo/p/18741027

mysql具有哪些锁

按锁的粒度分配:行级锁,表级锁,页级锁。
alt text

mvcc的实现原理

MVCC--一份数据保留多个版本的一种方式,查询时通过readview和版本链获得对应版本的数据
好处:提升并发性能,对于高并发场景,mvcc比行级锁开销更小

实现原理
MVCC的实现依赖于版本链,版本链具有三个隐藏字段的实现。DB_TRX_ID:事务id,通过事务id的大小判断事务的时间顺序。
DB_ROLL_PTR:回滚指针,指向了上一个版本,多个版本连接在一起构成了undo log版本链。
DR_ROW_ID:如果数据库没有主键,innodb自动生成。

生成版本链的执行流程
排他锁上锁后将上一条记录拷贝到undo log中,之后修改值,更新事务id,指针指向上一条老版本的记录

read view的作用
alt text
alt text

快照读和当前读

快照读:读取的是快照版本,select是快照都,通过mvcc选择一个版本,不需要加锁。
当前读:读取的是最新版本,如update,delete就是为当前读。
案列:当前读和快照读之间引发的幻读
幻读:在执行前和执行后的数据状态发生改变,但不是由执行引发的。
alt text
避免幻读:
alt text
next-key Lock锁介绍:
alt text
alt text

共享锁和排他锁

Select读取锁分为2种方式,共享和排他

select * from table where id<6 lock in share mode;--共享锁
select * from table where id<6 for update;--排他锁

特点 1.使用共享锁会导致同时更新一个表单时容易照成死锁。因为共享锁允许并发读但不允许写。导致写操作可能被不断搁置
2.使用排他锁的前提是不存在其他排他锁和共享锁,其他线程操作会被阻塞直到commit或者rollback为止
alt text

bin log/redo log/undo log

bin log:二进制日志,记录着修改操作,但不会记录select操作和show操作。
redo log(重新做):不管是否提交的都会被疾苦下,当数据库发生故障时候用于恢复到发生故障前保证数据完整性。
undo log(回滚日志):undo log表示撤回,可以实现mvcc

bin log和redo log有什么区别

1.bin log会记录所有日志事务,包裹innodb,mylsam等储存引擎日志,redo log只记录innodb自身的事务日志。
2,bin log只有在事务提交前写入磁盘,一个事务写一次,而redo log是不断执行。
3.bin log是逻辑日志,记录的是sql语句的原始逻辑,redo log是物理日志,记录某个数据页上的修改

讲讲mysql架构

Mysql猪粪server层和储存引擎层
alt text
alt text

分库分表

原因:数据库的量达到一定量后,所有查询等性能会降低,此时使用分库和分表来提高数据库的负担,缩短查询的时间。
垂直划分
竖着一刀切,将高热点的数据放在a表,如商品信息商品描述这种信息放到b表
alt text
alt text

水平划分
根据一定的条件,如id序列,年份,拆分为不同的数据库。
alt text
alt text

什么是分区表

分区表和水平分表的区别主要体现在于:分区是将表进行逻辑的拆分,在物理上这些表仍然属于同一个物理块,水平分表是将数据划分到不同的数据库中,物理位置已经发生了改变。
alt text

分区表的类型

1.range分区,按照范围分区。比如按照时间范围分区
2.list分区和range分区相似,主要区别在于list是枚举值列表的集合,range是连续的区间值的集合。对于list分区,分区字段必须是已知的,如果插入的字段不在分区时的枚举值中,将无法插入
alt text
3.hash分区:
alt text

分区的问题

1.打开和锁住所有底层表的成本可能很高
2.维护分区的成本可能很高,比如重组分区,会先建立一个临时的分区,然后将数据复制到其中,再删除原分区。
3.所有分区必须使用相同的存储引擎。

查询语句执行流程

查询语句的执行流程如下:权限校验、查询缓存、分析器、优化器、权限校验、执行器、引擎。
1.检查权限,如果没有权限返回错误。
2.MySQL8.0以前会查询缓存,缓存命中后直接返回。
3.进行语法分析。
4.两种执行方案,先查 id > 1 还是 name = '大彬',优化器根据自己的优化算法选择执行效率最好的方案;
5.校验权限

更新语句的执行流程

分析器、权限校验、执行器、引擎、redo log(prepare状态)、binlog、redo log(commit状态)
1.先进行where语句的查询(有缓存时使用缓存)
2.将查询结果的字段进行更改,然后调用引擎接口,写入更新数据,同时将数据保存再内存中,记录下redo log。
3.执行器收到通知,记录binlog,提交redo log为commit表示事务已经完成。
alt text

exist和in的区别

alt text

MySQL中int(10)和char(10)的区别

int(10)表示显示的数据长度,char(10)表示储存的数据长度

truncate、delete与drop区别?

alt text

having和where区别

1.对象不同,where语句用于表和视图,having用于组
2.where再数据分组前过滤,having在数据分组后进行过滤

什么是MySQL的主从同步

主从同步就是一个主节点(master)将数据复制到其他服务器上,其他的节点为从服务器(slave)。复制是异步进行,可以通过配置文件去精确到表,库。

为要做主从同步

1.读写分离:主节点写,从节点读。
2.在主服务器生成实时数据,在服务器上分析这些数据,从而提高主服务器的性能。
3.数据备份:保证数据的安全

乐观锁和悲观锁区别

悲观锁:假定会发生冲突,会进行加锁,直到事务完成前才会释放锁,在这段期间其他的事务无法对其进行修改。
乐观锁:假设不会发生冲突,在提交事务前判断数据是否被修改过,通常是使用cas算法来实现。

使用过processlist

show processlist 或 show full processlist 可以查看当前 MySQL 是否有压力,正在运行的SQL,有没有慢SQL正在执行。返回参数如下:
alt text

MySQL查询 limit 1000,10 和limit 10 速度一样快吗

offset是一个偏移量

limit offset, size 

alt text
alt text

优化上一部分的深分页

方法一:
alt text

select * from xxx  where id >=(select id from xxx order by id limit 500000, 1) order by id limit 10;

alt text
这样innodb再走一次主键索引,通过B+树快速定位到id=500000的行数据,时间复杂度是lg(n),然后向后取10条数据。
方法二:
自己手动的添加start_id,从后遍历10个数据
alt text

高度为3的b+树,可以存放多少数据

alt text
页面的大小为16kb,因为非叶子节点是指针存储id,bigint为8字节一页则1000的指针,3层就可以1000*1000,第三层纯数据,一般一个叶子节点16个所有可以有2kw的数据。

MySQL单表多大进行分库分表

1.MySQL单表数据量大于2kw行时。性能会明显下降
2.阿里巴巴开发手册是推荐500万行和单表容量超过2gb时。
实际是和机器硬件有关,索引会在内存中,如果索引过大超过内存就会引发磁盘io导致性能下降。因根据实际的情况进行分库分表

大表查询慢如何优化

1.建立索引。比如在常使用where和order by的地方建立索引,并通过explain查看是否用来索引还是全表扫描
alt text
alt text
alt text
alt text
2.索引优化。比如组合索引的符合最左匹配原则,SQL优化
3.建立分区,如时间字段,如果查询条件往往通过时间范围进行查询,能提升性能。
4.利用缓存,使用redis等缓存热点数据
5.限定查询范围,比如查找历史信息,控制在一个月的时间范围内。
6.冷热数据分离,
7.使用主从数据库完成读写分离

说说count(1)、count(*)和count(字段名)的区别

1.count(1) 会统计表中的所有的记录数,包含字段为null 的记录
2.count(字段名) 会统计该字段在表中出现的次数,忽略字段为null 的情况。即不统计字段为null 的记录。
alt text

MySQL中DATETIME 和 TIMESTAMP有什么区别

1.范围,空间,自动转呼喊,受时区影响
alt text

说说为什么不建议用外键

1.不利于并发,因为同时上多个锁
2.不利于扩展,当数据进行迁移的时候
3.不利于分库分表
alt text

使用自增主键的好处

自增主键保证了主键按照顺序的差人,让索引更加紧凑,提高了效率。

自增主键保存在哪些地方

alt text

自增主键一定是连续的吗

不一定,1,如果自增的值已经违反了唯一性,则自增的键值会不断向后滚动,下一次插入数据,就必须使用滚动插入的键值了。
2.自增的步数可以自己设置
3.
4.事务的回滚导致自增主键的不连续,因为回滚了,再次使用内存中的值,就不会再使用到滚动过的自增值了。即自增值不能回收利用。

InnoDB的自增值为什么不能回收利用

因为是有多个事务的,如果随意将内存的自增值回滚,则会与其他事务产生冲突。
alt text

MySQL数据如何同步到redis缓存中

1.通过redis自动同步器,MySQL触发器+UDF函数实现。
alt text

为什么阿里Java手册禁止使用存储过程

即将sql语句保存到数据库中,去调用。这些sql语句常常是一组出现。
1.树难以管理,无法调试
2.移植性差
alt text

MySQL update 是锁行还是锁表

alt text

select...for update会锁表还是锁行?

如果查询条件用了索引/主键,那么select ... for update就会加行锁。
如果是普通字段(没有索引/主键),那么select ..... for update就会加表锁。

MySQL的binlog有几种格式,分别有什么区别

alt text

阿里手册为什么禁止使用 count(列名)或 count(常量)来替代 count(*)

alt text

存储MD5值应该用VARCHAR还是用CHAR

结论使用char,因为md5是一个定长的值。对于定长值,char的效率会更高。
varchar的空间更加动态,但是每次更改值后要花多余操作去更新大小。而char则是定长,会浪费空间,但更块。

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

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

相关文章

AI 搜索你的所有笔记!思源笔记 +Cursor+MCP Server——打造你的个人专属 AI 资料库!(AI 大模型搜索笔记、内容总结、大纲凝练、RAG 搜索)

AI 搜索你的所有笔记!思源笔记 +Cursor+MCP Server ——打造你的个人专属 AI 资料库!(AI 大模型搜索笔记、内容总结、大纲凝练、RAG 搜索) 前排提示:本文撰写于 2025 年 2 月,仅仅离 Anthropic 发布的 MCP 协议过去不到 3 个月,因此本文很多接入 MCP 的方式还略显复杂。…

LLM大模型:deepseek浅度解析(四):Native Sparse Attention NSA原理

deepseek又整活了啊,2025.2.16的时候又发布了 "Native Sparse Attention: Hardware-Aligned and Natively Trainable Sparse Attention",核心是解决attention计算耗时耗算力的问题!NSA具体又是怎么做的了?回忆一下:attention效果好的核心原因,就是Q*K得到了tok…

聊一聊:Air8000能解决哪些社会问题?

Air8000能解决什么社会问题呢?当前我们认为可以解决如下的问题: 问题一 硬件:成本高,备货压力大,稳定性差 嵌入式的一些常用的功能,比如GPIO、4G、Wi-Fi、蓝牙、定位、充电、升压、处理器等等,是项目上常用的功能。 如果每个都是模块,组合起来成本不菲。 Air8000的定价…

Open开发:CSDK与LuatOS的深度剖析

究竟要不要支持CSDK开发? 我们先来了解一下4G模组的软件架构。目前,4G模组内部的软件架构无一例外都是用C语言开发的,仅在底层使用了少量汇编语言。 从技术角度看,让用户使用C语言开发应用似乎顺理成章。毕竟C语言功能强大,运行效率极高。 然而,C语言在物联网行业的应用存…

硒鼓内部结构示意图和功能说明

公司有一台惠普打印机,型号:HP Color LaserJet MFP M281fdw,更换硒鼓的成本是打印机最大的支出,最近在研究自己给墨盒加粉,直接买碳粉+芯片成本还是比较乐观的。 这里说明下,为什么要买芯片,买回来的一个全新的硒鼓是带有芯片的,然后装上打印机,可以看到该墨盒的使用情…

浅析Golang的内存管理(下篇):go垃圾回收机制

文章目录三色标记算法 混合写屏障 并发、增量回收机制 GC触发时机go语言作为内存托管类型的开发语言,go runtime提供了自动的内存管理机制,无需程序员手动管理对象的内存释放,go runtime会在合适的时机自动释放不需要的内存对象。 一、三色标记算法传统的内存对象标记算法早…

linux怎么判断服务器的cpu架构

在部署应用程序和服务时,确认服务器的CPU架构是非常重要的,因为这会直接影响软件的兼容性和性能。在Linux系统中,有许多方法可以获取服务器的CPU架构信息。本篇文章将介绍几种常用的方法,并提供代码示例,帮助用户有效地获取这个信息。 1. CPU架构的概念 CPU架构是指中央处…

vscode中不同项目使用不用的nodejs版本

只需要在vscode中当前项目里面增加一个设置

低代码在项目管理中的5大实战案例:不懂代码也能快速搭建系统!

作为项目管理领域的“老司机”,我见过太多团队因传统开发效率低、需求响应慢而错失机会。低代码平台的崛起,让业务人员也能快速搭建系统,大幅缩短交付周期。以下是5个典型场景的实践案例,用最通俗的语言讲透核心逻辑👇案例1:3天上线CRM系统(客户关系管理) 背景:某销售…

[字符串算法]Manacher

我将永远追随六花的脚步1.前置知识 回文子串  回文的子串 最长回文子串  字符串中最长的回文子串 回文半径  设以\(i\)为中心的最大回文子串的长度为\(n\),则这个字符串第\(i\)位的回文半径为\((n+1)/2\) 2.算法流程 2.1 预处理 在处理回文子串(马拉车算法适用)的问题时…

[数据结构]树

我最喜欢六花了树(基础) 1 定义 1.1 树是什么 树是一种数据结构,因为形似倒着的树而得名. 树是一种特殊图 1.2 树的定义 递归定义 1.2.1 有根树的定义 形象化的,如图1,有根树存在根节点这一定义,从根节点可以分出任意个分支,这任意个分支又可以继续细分,分出的节点称…

StrokesPlus【电脑鼠标键盘手势软件】v0.5.8.0 中文绿色便携版

点击上方蓝字关注我 前言 StrokesPlus.net是一个超方便的手势识别软件,它能帮你用手势来代替鼠标和键盘操作。用起来既简单又灵活,功能还特别强大。 操作起来非常简单,它有好多实用的功能,比如智能识别你写的字、设定手势操作的区域、模拟鼠标的各种动作、运行脚本、响应窗…