MySQL相关面试题

2023-05-16

1.MySQL text长度

mysql的text是65535的字节限制,而pg是不限制的、

2.覆盖索引**聚簇索引(https://blog.csdn.net/alexdamiao/article/details/51934917)

索引覆盖指的是,select 的列在索引中完全包括了,从二级索引拿就行了,不用再查一遍聚簇索引了。
聚簇索引中的每个叶子节点包含主键值、事务ID、回滚指针(rollback pointer用于事务和MVCC)和余下的列。
对于非主键索引---包含了主键值。通过二级索引查询首先查到是主键值,然后InnoDB再根据查到的主键值通过主键索引找到相应的数据块。
主键会创建聚簇索引。

https://blog.csdn.net/universsky2015/article/details/102712058   这个里面的图清晰的解释了。


innodb分主键索引和辅助索引,除了主键索引都是辅助索引(二级索引),都是使用的B+树,B+树数据解节点可以存储更多的键值,然后叶子节点存储data这样就查的很快,B+树非常的矮胖,这样减少IO次数。
如果查辅助索引的话,辅助索引的叶子节点data存储的是主键值,这样就转到查询主键索引了,而索引覆盖指的是 select 项只有你查询的索引键值,不在查主键索引了。

联合索引的B+树存储结构:每个之前存一个键的数据节点,现在存储多个键(联合索引中的键),然后根据联合索引的顺序进行依次键排序,最后叶子节点存储的仍是主键值。


3.左连接

会取所有左表数据,加上右表数据,其中右边要是在一个 on 条件的连接字段上有多条记录,就生成多条(左边重复,右表不重复)。
如果不建立索引会导致左连接是双重for循环,及其消耗性能

5.5之后版本 默认有一个缓存块嵌套循环Block Nested-Loop,这个会缓存多条左表记录,减少IO次数。

4.innodb特性

插入缓存:针对非聚簇索引(非主键索引)。
多个参数:
innodb_change_buffer_max_size 参数设置 Insert Buffer 的最大内存使用量      
InnoDB_flush_log_at_trx_commit  设置 InnoDB 在事务提交后的日志写入频率 因为持久化是先从内存写到binlog 再同步到磁盘的。
0:1s钟写入到日志文件并刷新到磁盘。
1:每次事务提交都被写入到日志文件并刷新到磁盘(默认)
2:每次事务提交都被写入到日志文件但不刷新到磁盘
sync_binlog:MySQL server 在 binary log 每写入 sync_binlog 次后,刷写到磁盘。

二次写
skip_innodb_doublewrite  默认是开启的。
如果数据库发生宕机时,可以通过重做日志对该页进行恢复,但是如果该页本身已经损坏了,进行重做恢复是没有意义的。因此引入了"二次写"方案,提高数据页的稳定性。

doublewrite 的整个流程如下:

对缓存池的脏页进行刷新时,不直接写入磁盘,而是通过 memcpy 函数将脏页复制到内存中的 doublewrite buffer。
将内存中的 doublewrite buffer 写入共享表空间的物理磁盘上(备份)。
将 doublewrite buffer 中的数据真正的刷新到表磁盘中。
如果写 doublewrite buffer 失败,那么这些数据不会写到磁盘,innodb 会载入磁盘原始数据和 redo 日志比较,并重新刷到 doublewrite buffer。
如果写 doublewrite buffer 成功,但是刷新到磁盘失败,那么 innodb 就不会通过redo日志来恢复了,而是直接刷新 double write buffer 中的数据到磁盘。
skip_innodb_double_written 参数可以用来禁止 doublewrite(二次写) 功能。

自适应哈希索引
Innodb存储引擎会监控对表上二级索引的查找,如果发现某二级索引被频繁访问,二级索引成为热数据,建立哈希索引可以带来速度的提升
innodb_adaptive_hash_index | ON 

5.b&b+树


多路平衡查找树。
只能逐一加载每一个磁盘页。
对于树来说,IO次数就是树的高度,而“矮胖”就是b树的特征之一,它的每个节点最多包含m个孩子,m称为b树的阶,m的大小取决于磁盘页的大小。
b树,数据节点存数据, b+树,只有叶子节点存数据,其余数据节点存的都是键值。

6.exists 和 in 


in 走索引,  exists 走 BNL 缓存块嵌套循环Block Nested-Loop  5.5版本之后的mysql
not in 和not exists:如果查询语句使用了not in,那么内外表都进行全表扫描,没有用到索引;而not extsts的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快。

7. innodb的锁  https://segmentfault.com/a/1190000014133576

innodb的所有行锁算法都是基于索引的。没有索引的where就全表加锁。

记录锁  锁行
gap间隙锁  锁区域
next-key锁  锁区域+行

排他锁和共享锁
给行加完排它锁前后都不能有没释放的排它锁或者共享锁,否则加锁失败,例如 悲观锁 select for update 就给行/表加排它锁了。

加共享锁 当前读  select where ? lock in share mode;  这样别的事务在当前事务没提交前,不能加排他锁/更新。这样读的话就是最新数据了。

还有一种方式是 快照读  就是不加共享锁,那么其他事务可以加排它锁,读的只是一个快照了。
InnoDB默认的RR事务隔离级别下,不显式加『lock in share mode』与『for update』的『select』操作都属于快照读,保证事务执行过程中只有第一次读之前提交的修改和自己的修改可见,其他的均不可见;

MVCC 相当于一个行级锁的变种,很多情况下避免了加锁操作。
保存着两个额外的系统版本号,使大多数读操作都可以不用加锁。这样设计使得读操作简单,性能强,并且保证只会读取到符合标准的行。不足之处是没行记录都需要额外的存储空间,需要做更多的检查工作,以及一些额外的维护工作。
MVCC目的是让读写不冲突。记录版本号,版本号每创建一个事务就会++。mvcc具体作用就是在写事务没有提交的情况下,我们也可以进行读


8.乐观锁与悲观锁

乐观锁的实现大致是  数据库加一个版本号version字段,然后做更新操作的时候先查一下
select version from task where id = xxx;
update task set value = newValue,version =  versionValue + 1   where version = versionValue;

悲观锁 (更新/插入多的环境)
begin ;
select res_id from tab where id = 1 for update
update tab set status = 1 where res_id = <res_id>
commit;
FOR UPDATE 仅适用于InnoDB,且必须在事务区块(start sta/COMMIT)中才能生效。 只有明确select for update 的语句中明确id才是行锁,否则表锁。

mysql读锁(共享锁)与写锁(排他锁)_She_lock的博客-CSDN博客_读锁和写锁


9.mysql一次SQL查询的具体过程

客户端创建sql --- 查询缓存(一般关掉) --- SQL解析、预处理 查询优化器 --- 存储引擎API执行查询


 

参照:

MySQL数据库面试题(2020最新版)_ThinkWon的博客-CSDN博客_mysql面试题           一坨面试题

https://blog.csdn.net/alexdamiao/article/details/51934917           聚簇索引&&覆盖索引

https://blog.csdn.net/universsky2015/article/details/102712058   聚簇索引

https://segmentfault.com/a/1190000014133576                            innodb锁

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL相关面试题 的相关文章

  • vscode 使用makefile 在线调试运行C/C++程序的方法

    1 前言 上一篇文章vscode在线调试C C 43 43 程序的方法中介绍了调试程序的方法 xff0c 由于文章中使用的编译程序规则是调用task json中来实现的 xff0c 不适用于一般的程序 目前大多数程序都是来使用makefil
  • 我的2013年终总结

    2013年6月毕业 xff0c 2012年九月开始实习 xff0c 一直在做和android相关的开发 工作有的涉及硬件 xff0c 有的是专门为公司定制的app 2013年的遗憾就是 xff0c 这一年里自己没有一款上线的app 听相关的
  • 用Android手机spydroid-ipcamera搭载局域网监控环境

    相比有很多人都想用手机实现视频监控吧 xff0c 今天这个教程 xff0c 将会教大家用spydroid ipcamera搭建局域网监控环境 准备工作 xff1a 1 准备一部带有摄像头的 xff0c API level在9以上的手机 xf
  • 3D数学--学习笔记(三):3D中绕任意轴的旋转

    本文转自 xff1a http blog csdn net zjc game coder article details 24269757 不要小看我们在Unity或者3DMAX中的一个简单的旋转物体操作 题记 这里需要用到的知识 xff1
  • Android拼图游戏开发全纪录0

    本文转自 xff1a http blog csdn net eclipsexys article details 18881849 最近刚完成一个Android的小项目 拼图游戏 项目并不复杂 xff0c 但也是一个完整的项目 xff0c
  • Android拼图游戏开发全纪录1

    本文转自 xff1a http blog csdn net eclipsexys article details 18887567 今天我们继续来讲解Android拼图游戏全纪录的第二篇 xff0c 今天要完成的任务比较简单 xff1a 界
  • Android 4.2 SafeVolume机制

    最近一个项目过认证 xff0c 在声压测试时failed 整改方案为 xff1a 在用户将耳机音量提高至安全音量以上时 xff0c 阻止此操作并弹出警告框 xff0c 待用户确认后才提升音量 一开始并不知道android4 2中默认自带了这
  • 命令行查看android手机wi-fi密码

    两招帮你查看wifi密码 xff08 抱歉 xff1a 由于无法传第三张图片 xff0c 第三个图片内容请参照参考网址获得 xff09 第一 xff0c 手机必须root 第二 xff0c 用es文件浏览器或RE管理器进入date misc
  • android网络时间同步总结

    本文转自 xff1a http www cnblogs com hoji real archive 2011 11 14 2247984 html 最近看了下网络时间同步 xff0c 总结一下 整体描述 xff1a android网络时间同
  • win7删除ubuntu系统

    win7 43 ubuntu双系统 xff0c ubuntu开机的时候 xff0c 电脑会响 xff0c ubuntu系统进不去 进入win7系统后 xff0c F盘是通过磁盘管理压缩剩余空间安装ubuntu系统的 xff0c QQ安装在F
  • 手机电池和taskId的寻找

    刷机的时候启动手机时间比较久 xff0c 拔掉电池给手机断电 xff0c 启动的比较快一点 一直这样干 xff0c 一段时间以后 xff0c 手机充电的时候 xff0c 会显示bad battery 提示电池坏掉 电池坏掉后 xff0c 刷
  • 如何使用Proteus进行电路设计仿真?

    Proteus是一款功能非常强大的软件 xff0c 是英国著名的EDA工具 仿真软件 xff0c 从原理图布图 代码调试到单片机与外围电路协同仿真 xff0c 一键切换到PCB设计 xff0c 真正实现了从概念到产品的完整设计 支持和Kei
  • OKHttpUtils使用介绍

    一 xff0c 概述 在上一篇blog的末尾讲到了OKHttp使用时的缺点 xff0c 和对OKHttp封装的必要性 在github上有很多对OKHttp封装的优秀框架 xff0c 其首推的就是hongyang大神的OKHttpUtils
  • Ubuntu18.04LTS系统盘制作

    记录一下制作系统盘的过程 xff0c 参考资料如下网址 xff0c 谢谢 win10下安装Ubuntu16 04双系统 xff0c 用软碟通制作系统盘 gt 点击此处网址 xff1b 安装win7 Ubuntu16 04双系统 xff0c
  • vmware12-15中ubuntu15.10-18.10的vmwaretools失效,不能拖动复制粘贴以及自动适应窗口分辨率

    新安装或异常关机或重新划分分区导致的vmware tools失效 xff0c 不能拖动复制粘贴文件文本以及自动适应窗口分辨率 xff0c 无论怎样重装vmware tools或open vm tools均无效 最后发现有效的方法如下 xff
  • 【环境搭建】Docker镜像相关操作(切换镜像源、查询、获取、查看、创建、上传、保存、删除等)

    目录 1 镜像源查看及设置2 镜像相关操作2 1 获取镜像列表2 2 镜像下载2 3 查看本地的镜像2 4 从镜像创建容器2 5 将容器抽象为镜像 commit2 6 将容器抽象为镜像 Dockerfile2 7 将镜像保存为压缩包2 8
  • 【废了-准备删除02】信息收集——基于WAMP的drupal7.x管理系统

    目录 1 概述2 域名 子域名 IP信息收集3 端口扫描3 1 扫描过程3 2 小结 4 网站目录扫描4 1 目的4 2 dirbuster 扫描4 3 御剑后台扫描4 4 小结 5 指纹识别5 1 目的5 2 指纹识别5 3 指纹利用5
  • Spring boot App启动报错 missing ServletWebServerFactory bean

    将一个普通Java App应用改写为Java Web App xff0c 添加了spring boot starter parent之后 xff0c Run as Spring App一致报如下错 org springframework c
  • 开源项目|RT-Thread 软件包应用作品:水墨屏桌面台历

    简介 平时经常会有一些事情忘记 xff0c 比如今天几号 xff0c 星期几 xff0c 哪天有什么事情要做 有时候写在本子上 xff0c 有时候记在微信里 xff0c 但有时候连记在哪里都忘记了 为了应对这个情况 xff0c 我制作了一款
  • 【嵌入式AI入门日记】将 AI 模型移植到 RT-Thread 上(1)

    本期我们分享主题是如何将 AI 模型部署到嵌入式系统中 xff0c 下一期将介绍如何在 RT Thread 操作系统上运行 Mnist Demo xff08 手写数字识别 xff09 嵌入式关联 AI AI落地一直是一个很红火的前景和朝阳行

随机推荐

  • uc/os-ii任务调度的锁定与解锁

    调度器上锁函数OSSchedlock 的功能是用于禁止任务调度 xff0c 使任务保持对CPU的控制权 调度器开锁函数OSSchedUnlock 的功能是解除对任务调度的禁止 调度器上锁和开锁的实现原理是 xff1a 对全局变量锁定嵌套计数
  • uc/os-ii信号量集

    在实际应用中 xff0c 任务常常需要与多个事件同步 xff0c 即要根据多个信号量组合作用的结果来决定任务的运行方式 C OS II为了实现多个信号量组合的功能定义了一种特殊的数据结构 信号量集 信号量集所能管理的信号量都是一些二值信号
  • 【OK6410裸机程序】点亮LED

    globl start start 硬件相关的设置 Peri port setup ldr r0 61 0x70000000 orr r0 r0 0x13 mcr p15 0 r0 c15 c2 4 64 256M 0x70000000 0
  • 通过串口实现printf和scanf函数

    转自 草根老师博客 xff08 程姚根 xff09 在做裸板开发时 xff0c 常常需要通过输出或者通过串口输入一些信息 在有操作系统机器上 xff0c 我们很少关心输入和输出的问题 因为有很多现成的库函数供我们调用 在做裸板开发时 xff
  • DDR协议解析

    DRAM内部分割成多个L Bank xff0c 每个L Bank形状相同 xff0c 彼此独立 xff0c 可以独立工作 早期的DRAM芯片内部分为2个L Bank xff0c 后来是4个 xff0c DDR3内存芯片为8个 在进行寻址时需
  • apt-get安装指定版本&查询版本

    一 通过apt get安装指定版本 apt get install lt lt package name gt gt 61 lt lt version gt gt 二 查询指定软件有多少个版本 说明 xff1a 在Linux用这个查询并不能
  • 使用apt-get install时有时候一堆依赖要安装,一个一个安装特别烦人,可以直接用suggest全部安装,具体命令如下

    使用apt get install时有时候一堆依赖要安装 xff0c 一个一个安装特别烦人 xff0c 可以直接用suggest全部安装 xff0c 具体命令如下 apt get install install suggests packa
  • linux-Centos 7下tftp-server服务的安装与配置

    转自 http www cnblogs com 5201351 p 4934625 html TFTP xff08 Trivial File Transfer Protocol 简单文件传输协议 xff09 是TCP IP协议族中的一个用来
  • Linux启动打印信息

    U Boot 1 1 6 Oct 5 2016 16 45 02 for SMDK6410 u boot 1 1 6 Updated for OK6410 TE6410 Board Version 2012 09 23 OEM Forlin
  • 对比S3C6410外部中断STM32外部中断

    转自 xff1a http comm chinaaet com adi blogdetail aspx id 61 40071 amp currentpage 61 2 a S3C6410外部中断 中断在嵌入式里面是很常见的一个功能了 通过
  • shell脚本记录

    1 find name o 找出当前目录下所有的 o文件 使用在makefile中如下 clean rm f liblog so 96 find name o 96
  • makefile中的patsubst

    1 wildcard 扩展通配符 2 notdir xff1a 去除路径 3 patsubst xff1a 替换通配符 例子 xff1a 建立一个测试目录 xff0c 在测试目录下建立一个名为sub的子目录 mkdir test cd te
  • ElasticSearch学习&&理解

    注 xff1a 本篇的es基于7 5 1版本 目录 Elasticsearch是什么 xff1f ElasticSearch的环境搭建 ElasticSearch的名词 ElasticSearch查询出的数据格式 ElasticSearch
  • Kibana学习&理解

    注 xff1a 本篇的kibana基于7 5 1版本 Kibana是什么 xff1f kibana是一个数据可视化平台 展示与分析 将es里面的东西通过各种图表展示出来 xff0c 还可以执行es的各种搜索 amp 监控 Kibana环境搭
  • filebeat学习

    注 xff1a 本篇基于filebeat7 5 2 filebeat是什么 xff1f Filebeat 是用于转发和集中日志数据的轻量级传送程序 作为服务器上的代理安装 xff0c Filebeat 监视您指定的日志文件或位置 xff0c
  • Git Flow 用法

    git flow 工作流程 如下图所示 master 分支 master 分支主要方稳定 随时可上线的版本 这个分支只能从别的分支上合并过来 xff0c 一般来讲 xff0c 从develop 上合并 xff0c 或者从hotfix分支上合
  • Qt父窗口与子窗口间的焦点传递问题的完美解决

    使用activateWindow 或者raise 参考文章 xff1a https blog csdn net Hoarce article details 107215868 http www manongjc com detail 19
  • Git 工作中的一些命令操作

    本篇为工作中 git 使用过程中的一些操作记载 xff0c 不定期更新 目录 1 git 推本地代码到远程 2 git 放弃修改 commit 撤销远程提交记录 3 git pull push fetch 4 git关联本地与远程分支 5
  • php如何使用S3

    本篇是新手使用PHP调aws的s3服务的一些心得 一 关于AWS S3 s3是一个文件存储服务 xff0c 当需要做成服务来进行微服务调用 xff0c 或者终端服务端文件交流使用s3是一个非常不错的选择 aws各种常见的语言例如 xff1a
  • MySQL相关面试题

    1 MySQL text长度 mysql的text是65535的字节限制 xff0c 而pg是不限制的 2 覆盖索引 聚簇索引 xff08 https blog csdn net alexdamiao article details 519