DBA面试题-1

面临失业,整理一下面试题,找下家继续搬砖

主要参考:https://www.csdn.net/?spm=1001.2101.3001.4476

略有修改

一、mysql有哪些数据类型


1, 整形


tinyint,smallint,medumint,int,bigint;分别占用1字节、2字节、3字节、4字节、8字节
都可以带unsigned无符号
都可以带(x)来限制显示宽度
还有float,double,decimal的小数类型


2, 字符串


varchar,char,text blob
    1, char和varchar()指的是字符,不是字节;即char(10)可以存10个英文字母或者1汉字
    2, char()和varchar() utf8存一个汉字占3个字节,英文字母占1个字节;Length()查看字节长度,char_length()查看字符长度;
    3, char定长,尾部空格填充,性能好;varchar()变长,开头用1-2字节填充,结尾1个字节表结束
    4, char对英文字符占1个字节,汉语占2个字节;varchar每个字符2个字节
    5,  char 0-255,varchar 65535字节长度, 存汉字要除以3
    6,  text又分text,mediumtext,longtext-4G
    7,  blob存储二进制文件
    8, 推荐varchar()
    9, char和varchar支持默认值,text不支持
    
    

3, 时间


datetime, date,timestamp
推荐timestamp


二, 三范式


概念


是设计关系型数据库的规范,旨在减少冗余、提高一致性和简化维护
1NF:要求每一列都是原子的,例如联系方式中如果同时包含电话、邮箱、微信等久不符合
2NF:要求每个非主属性完全依赖于主键,而不能仅仅依赖主键一部分;例如客户表的数据要依赖于客户ID,不能依赖于客户姓名;
3NF:每个非主属性都是直接依赖主键,而不是间接依赖。 例如订单明细表中,产品名称和价格依赖于产品ID,产品ID依赖于订单ID;这样构成了传递依赖,这样可以将产品信息单独放入产品表中;


三范式优缺点

范式: 
优点:减少冗余、表更新快,存储空间少;
缺点:查询的时候要关联多个表,难以优化;
反范式
优点:通过冗余数据提高查询性能,减少关联,可以更好优化索引。
缺点:存在大量冗余数据,维护成本更高。 

实际工作中将范式和反范式结合用,对于请求量特别高的数据可以适当反范式;

三、索引

定义


索引(Index)是一种用于提高数据库查询效率的数据结构。它类似于书籍的目录,能够帮助快速定位并检索表中的数据行。
通过索引,数据库系统可以不必扫描整个表来查找所需的数据,而是直接访问索引结构,从而显著提高查询速度。


分类


物理分类:
聚簇索引:表中索引的键值顺序和数据行的存储顺序一致;
非聚簇索引:逻辑顺序和数据行的物理顺序不一致;

应用分类:主键索引、唯一索引、普通索引、组合索引
唯一索引可以为空,且可以多个空值;
主键索引不为空;


索引优点


    唯一索引可以保证唯一性
    索引恶意极大加快检索效率
    加速排序和分组操作
    可以加速表之间的连接效率
索引缺点:
    创建和维护索引需要花费时间,而且随着数据量的增加而增加;
    索引会占用物理机空间
    增加写操作开销,插入、更新、删除都需要对索引进行维护,这会增加操作开销,特别是大量写入时
    可能降低查询性能:如果索引选择不当,会导致查询性能下降
    


索引设计原则


    优先选择唯一性索引,速度快;
    经常作为查询条件的字段选择索引;
    限制索引数量
    尽量使用少的做索引
    清理不用的索引


索引的数据结构


    B+树和HASH索引
    Innodb使用的是B+树索引;
    Innodb内部实现了一个自适应hash功能:当用户执行大量查询操作,且很多查询都是访问相同的页面或者寻路模式,
    那么Innodb可能会在内存缓冲器中创建一个自适应hash索引,加速这些频繁的查询操作。

四、B+树结构


MySQL使用B+树作为其索引的数据结构,B+数是平衡多路搜索树,有如下特点
1, 数据存储位置: 存储在叶子节点,非叶子节点只存储索引;
2, 叶子节点连接方式:所有叶子节点通过指针相连,形成有序链表,便于顺序访问和范围查询;
3, 树高度:B+树的内部节点可以存储更多键值,因此比B-树具备更少的高度,所以在B+树中查找、删除、插入需要更少的IO
4, 查询效率:由于叶子节点间形成有序链表, 顺序访问和范围查询效率高; 效率:O(log n)
5, 插入和删除:由于数据只存储在叶子节点,所以操作只影响叶子节点和父节点,插入和删除快;


为什么MySQL用B+树不用B树


1,IO优化:B+树的非叶子节点只存储键值信息,不存储数据,所以每个节点能够存储更多的键值信息,从而查询同一层时,能够一次性读取更多数据块。减少磁盘IO操作;
            B树每个节点同时存储键值和数据,增加了节点大小,进而增加IO
            
2, 查询效率:B+树叶子节点间形成有序链表,范围和顺序查询快;
            由于B+树非叶子节点只存储键值信息,每个节点可以容纳更多键,从而降低树高度,树的高度减少意味着查找路径变短,查找效率提高
3, 动态维护:
    自平衡性:B+树能够在数据发生变化时自动调整,保持树平衡。确保了查询的效率和稳定性。
    插入和删除:B+树在某些情况下对插入和删除更高效,B+树可能只需要修改少量指针,而不用分裂合并

五、最左匹配原则


定义:使用联合索引时,查询条件必须从最左侧开始匹配,并且连续地使用索引。        
注意:    如果查询条件中包含范围查询(>,<,between,like前缀),MySQL会停止匹配。

最左匹配原理:因为组合索引是一个B+树,例如(a,b),它会按照最左字段构建。当a相等的时候,b是有序的,但是这个有序是相对的; 所以遇上范围查询的时候就会停止继续匹配;
    例如a=1 and b=2都可以命中,而a>1 and b=2无法命中

六、覆盖索引


覆盖索引(Covering Index)是一种特殊类型的索引,它不仅包含查询条件中的列,还包含要返回的列。换句话说,覆盖索引是一个包含查询所需所有列的索引,因此数据库只需查找索引,而不需要访问数据行(表),从而提高查询性能


七、什么是索引下推?

介绍
索引下推(Index condition pushdown) 简称 ICP,主要用于提升使用索引的查询效率。
在MySQL中,查询优化器会决定使用哪些索引来加速查询。当使用索引进行范围扫描时,传统的做法是先通过索引找到所有满足条件的索引项,然后回表(即访问实际的表数据)来获取完整的行数据,再在服务器层对这些行进行过滤,以确保它们满足WHERE子句中的其他条件。

索引下推技术则改变了这一流程:它将一部分过滤条件“下推”到存储引擎层,让存储引擎在扫描索引时就进行部分条件的过滤。这意味着存储引擎只返回那些真正满足所有条件的行数据给服务器层,从而减少服务器层需要处理的数据量。


索引下推的优势
1,减少数据访问,由于存储引擎在扫描时就进行了部分过滤,因此它只返回满足所有条件的行数据,减少了服务器层需要处理的数据量。
2,提高查询效率,通过减少不必要的数据访问和传输,索引下推可以显著提升性能。
3,降低IO开销:由于减少了存储引擎到服务器层的传输,从而降低了IO开销;


使用场景
索引下推通常用于带有范围扫描和复合条件的查询。例如,假设有一个表users,包含字段age和status,并且在这两个字段上建立了一个复合索引(age, status)。如果执行以下查询:

SELECT * FROM users WHERE age BETWEEN 20 AND 30 AND status = 'active';


在没有索引下推的情况下,MySQL会先通过索引找到age在20到30之间的所有行,然后回表获取这些行的完整数据,并在服务器层过滤出status = 'active'的行。

而在使用索引下推的情况下,MySQL会将status = 'active'这一条件“下推”到存储引擎层,让存储引擎在扫描索引时就进行过滤,只返回满足age BETWEEN 20 AND 30且status = 'active'的行数据给服务器层。

验证ICP是否生效?
可以使用EXPLAIN语句。在EXPLAIN的输出中,如果Extra列包含Using index condition,则表示该查询使用了索引下推优化。

八、存储


InnoDB 的四大特性?


支持事务
行级锁
外检约束
崩溃恢复


InnoDB 为何推荐使用自增主键?


1, 提高插入性能:自增主键可以保证每次插入时B+索引是从右边扩展的,可以避免B+树频繁合并和分裂。如果使用字符串主键和随机主键,会使得数据随机插入,效率比较差。
2, 减少页分裂和碎片:Innodb中,数据以页为单位进行存储。如果主键非自增,新数据插入可能导致页分裂,即原有的页无法容纳新数据需要将数据拆分到2个页中。这会增加额外的IO开销和CPU资源;
    而使用自增主键的时候,数据通常都可以顺序追加到页中,减少了分页频率,提高存储效率,减少了数据碎片。由于数据按顺序追加,所以空间利用率高,减少了空间浪费。
3, 预测和缓存:使用自增主键,由于主键值是顺序递增,系统可以很容易预测下一个主键值,这种可预测性使得数据库可以更有效地利用缓存和预测机制,提前加载和缓存即将访问的数据,提高查询性能。
4, 二次索引优势:当使用自增主键时,由于聚簇索引是有序的,非聚簇索引的查询效率也会得到提升


如何选择引擎:
建议统一用Innodb


什么是Innodb的页区段?

介绍

页(page):是存储的最小单位,每一页默认 16k,是数据实际存储的页;
区(extent):逻辑概念,因为页非常多,不利于回收和管理,引入区(extent)的概念来便于资源的分配和回收,是innodb分配和回收资源的单位,每个区是连续地64 pages,即1MB;
段(segment):逻辑概念,段由一个或多个区组成,可以不连续。段是数据库的分配单位,不同类型的数据对象以不同的段形式存在。有数据段(叶子节点),索引段(非叶子节点),回滚段。

页有哪些信息组成

File Header: 文件头,描述数据页的外部信息,属于哪个表空间,前后页的页号。

Page Header: 页头,描述页的信息,有多少条记录,第一条记录的位置

infimum和superemum:系统生成的记录,分别是最小记录值和最大记录值。

User Records: 表中对应的数据,一般用Compact格式

除了表中插入的数据外还有一些隐藏列,另外还有transaction_id(事务ID), roll_pointer(回滚指针)

roll_id :有主键则指定主键,没有则用唯一索引,也没有则系统自动生成row_id;为隐藏列

Free Page:页中的空闲存储,可以插入记录。

Page Directory:类似字典的目录结构,根据主键大小每隔4-8个记录设置一个槽,用来记录其位置,当根据主键查找位置时,首先找到数据所在的槽,然后在槽中线性搜索。这种方法比遍历页要快。

Page Tailer:File Header存储刷盘前内存的校验和,Page Tailer储存刷盘后的校验和。当刷盘的时候,出现异常,Page Tailer和File Header中的校验和不一致,则说明出现刷盘错误。

页中插入记录的过程

1,如果Free Space空间足够的话,则直接分配空间来添加记录,并将插入前最后一条记录的next-record指向当前的插入记录,将当前记录的next-record指向supremum记录

2, 如果Free Space空间不够的话,将之前删除造成的碎片重新整理后,按照上述步骤重新插入

3, 如果当前页碎片整理后还不够的话,则重新申请页,将页初始化后按照上述步骤重新插入

什么是Buffer Pool

Buffer Pool是Innodb引擎层的缓冲池,不属于MySQL的Server层

内存中以页(page)为单位缓存磁盘数据,减少磁盘IO,提升访问速度。缓冲池大小默认 128M,独立的 MySQL 服务器推荐设置缓冲池大小为总内存的 80%。主要存储数据页、索引页更新缓冲(change buffer)等。

预读机制

Buffer Pool有一项技能交预读机制,存储引擎在被Server层调用时,会在响应的同时进行预判,将下次可能用到的数据和索引加载到Buffer Pool中。

预读策略分为线性预读(innodb_read_ahead_threshold)和随机预读,Innodb用线性,随机已基本废弃

线性预读:如果前面的请求顺序地访问当前区(extend)的页,那么接下来的请求也会顺序地访问下一个区的页,并将下一个区加载到BufferPool中

换页算法

Innodb的淘汰策略(换页算法)和传统的LRU(最少使用算法)不同,面临如下2个问题

1,预读失败:由于提前将数据放入BufferPool,但是MySQL最终没有从页中读取

要解决预读失败问题,则让预读失败的数据停留缓冲池时间尽可能短,预读成功的页停留尽可能长。具体将LRU链分代实现,即新生代和老年代。预读页假如缓冲池时只假如老年代的头部,只有真正预读成功了再转到新生代。如果预读失败则最先被清理。

2,缓冲池污染:如果批量扫描大量数据的时候,可能导致缓冲池所有页都被替换,导致大量热数据被换出,MySQL性能急剧下降

InnoDB Buffer Pool加入了一个老生带停留时间窗口机制,只有预读成功,并且在老年代提留时间超过该窗口时间的数据才会被放入新生代头部。

什么是Change Buffer?

如果每次写操作都更新磁盘数据,会占满IO,导致性能慢。为了减少IO,InnoDB在BufferPool中开辟了一块内存,用来存储变更记录,为了防止异常宕机丢失数据,当事务提交时会将变更记录持久化到磁盘(redo log)。等待时机更新磁盘的数据文件(刷脏),用来缓存写操作的内存就是Change Buffer。

Change Buffer默认占Buffer Pool的25%,最大50%

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

「Mac畅玩鸿蒙与硬件43」UI互动应用篇20 - 闪烁按钮效果

本篇将带你实现一个带有闪烁动画的按钮交互效果。通过动态改变按钮颜色&#xff0c;用户可以在视觉上感受到按钮的闪烁效果&#xff0c;提升界面互动体验。 关键词 UI互动应用闪烁动画动态按钮状态管理用户交互 一、功能说明 闪烁按钮效果应用实现了一个动态交互功能&#xf…

「Mac畅玩鸿蒙与硬件40」UI互动应用篇17 - 照片墙布局

本篇将带你实现一个简单的照片墙布局应用&#xff0c;通过展示多张图片组成照片墙效果&#xff0c;用户可以点击图片查看其状态变化。 关键词 UI互动应用照片墙布局Grid 布局动态图片加载用户交互 一、功能说明 照片墙布局应用的特点&#xff1a; 动态加载多张图片组成网格布…

LabVIEW中“this VI‘s owning library is missing”错误及解决

问题描述 当加载或打开一个VI时&#xff0c;如果其所属的项目库未加载到内存&#xff0c;LabVIEW将提示错误&#xff1a;“this VIs owning library is missing”&#xff08;该VI的所属库不存在&#xff09;。 该问题通常发生在以下情况下&#xff1a; 项目库文件丢失或路径…

电子电气架构 --- 新四化对汽车电子的影响

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 所谓鸡汤&#xff0c;要么蛊惑你认命&#xff0c;要么怂恿你拼命&#xff0c;但都是回避问题的根源&…

etcd分布式存储系统快速入门指南

在分布式系统的复杂世界中&#xff0c;确保有效的数据管理至关重要。分布式可靠的键值存储在维护跨分布式环境的数据一致性和可伸缩性方面起着关键作用。 在这个全面的教程中&#xff0c;我们将深入研究etcd&#xff0c;这是一个开源的分布式键值存储。我们将探索其基本概念、特…

汽车IVI中控开发入门及进阶(三十五):架构QML App Architecture Best Practices

在Qt/QML工程的架构中,架构很重要,虽然本身它有分层,比如QML调用资源文件(图片等)显示GUI界面,后面的CPP文件实现界面逻辑,但是这个分类还有点粗。在实际开发中,界面逻辑也就是基于类cpp的实现,也开始使用各种面向对象的设计模式,实现更加优秀的开发架构,这点尤其在…

Java版-速通数组基础知识

一,单数组的双指针法 从两端到中间的双指针法 例如,对于字符串abc,我们要对字符串进行反转,将字符串反转为cba。 可以使用一个初始位置在头部的指针pLeft,另一个起始位置在尾部的指针pRight,将两个指针同时向中间移动。 当为奇数个数组的时候,两个指针在中位相遇,当为…

SSH克隆github项目

1、生成密钥 ssh-keygen -t rsa -C "你的邮箱xxx.com" 全程回车即可&#xff08;不用输入ras文件名及密码&#xff09;、为了方便下面的公钥查看 2、配置公钥 查看公钥内容 cat c:\Users\xxx\.ssh\id_rsa.pub(修改为自己的路径及名字) 将公钥内容复制并粘贴至…

十、软件设计架构-微服务-服务调用Feign

文章目录 前言一、Feign介绍1. 什么是Feign2. 什么是Http客户端3. Feign 和 OpenFeign 的区别 二、Feign底层原理三、Feign工作原理详解1. 动态代理机制2. 动态代理的创建过程3. 创建详细流程4. FeignClient属性 四、Feign使用1. 常规调用2.日志打印3. 添加Header 前言 服务调…

Dolphinscheduler DAG核心源码剖析

背景描述 注意 : 在 Dolphinscheduler 中&#xff0c;离线任务是有完整的声明周期的&#xff0c;比如说停止、暂停、暂停恢复、重跑等等&#xff0c;都是以DAG(有向无环图的形式进行任务组织)T1离线任务的。 Dolphinscheduler DAG实现 org.apache.dolphinscheduler.common.gr…

渤海证券基于互联网环境的漏洞主动防护方案探索与实践

来源&#xff1a;中国金融电脑 作者&#xff1a;渤海证券股份有限公司信息技术总部 刘洋 伴随互联网业务的蓬勃发展&#xff0c;证券行业成为黑客进行网络攻击的重要目标之一&#xff0c;网络攻击的形式也变得愈发多样且复杂。网络攻击如同悬于行业之上的达摩克利斯之剑&…

AI与低代码技术融合:如何加速企业智能化应用开发?

引言 随着全球数字化转型的步伐加快&#xff0c;企业在智能化应用开发方面面临着前所未有的挑战和机遇。传统的软件开发方式往往需要大量的技术人员、时间和资源&#xff0c;而在瞬息万变的市场环境中&#xff0c;这种模式显得效率低下且难以满足企业快速迭代和创新的需求。 与…

基于 FFmpeg/Scrcpy 框架构建的一款高性能的安卓设备投屏管理工具-供大家学习研究参考

支持的投屏方式有:USB,WIFIADB,OTG,投屏之前需要开启开发者选项里面的USB调试。 主要功能有: 1.支持单个或多个设备投屏。 2.支持键鼠操控。 3.支持文字输入。 4.支持共享剪切板(可复制粘贴电脑端文字到手机端,也可导出手机剪切板到电脑端)。 5.支持视频图片上传,可单…

springboot整合mybatis-plus【详细版】

目录 一&#xff0c;简介 1. 什么是mybatis-plus2.mybatis-plus特点 二&#xff0c;搭建基本环境 1. 导入基本依赖&#xff1a;2. 编写配置文件3. 创建实体类4. 编写controller层5. 编写service接口6. 编写service层7. 编写mapper层 三&#xff0c;基本知识介绍 1. 基本注解 T…

MAUI APP开发蓝牙协议的经验分享:与跳绳设备对接

在开发MAUI应用程序时&#xff0c;蓝牙协议的应用是一个重要的环节&#xff0c;尤其是在需要与外部设备如智能跳绳进行数据交换的场景中。以下是我在开发过程中的一些经验和心得&#xff0c;希望能为你的项目提供帮助。 1. 蓝牙协议基础 蓝牙协议是无线通信的一种标准&#x…

快速构建NLP理论知识体系

NLP理论知识体系 一句话解释NLPNLP模型及原理简述1、Rag 一句话解释NLP 如果我们要实现机器翻译、情感分析、问答系统、文本摘要、聊天机器人、构造智能化的辅助文件填写模板&#xff0c;NLP可以通过现成的模型对输入的语音、文字、图片进行处理&#xff08;分词、标词性、去停…

试题转excel;pdf转excel;试卷转Excel,word试题转excel

一、问题描述 一名教师朋友&#xff0c;偶尔会需要整理一些高质量的题目到excel中 以往都是手动复制搬运&#xff0c;几百道题几乎需要一个下午的时间 关键这些事&#xff0c;枯燥无聊费眼睛&#xff0c;实在是看起来就很蠢的工作 就想着做一个工具&#xff0c;可以自动处理…

Android Gradle 相关

JDK环境配置&#xff1a; 1、Gradle运行时的JDK&#xff0c;即Gradle需要用到的JDK&#xff0c;配置如下&#xff1a; 如需修改现有项目的 Gradle JDK 配置&#xff0c;请依次点击 File&#xff08;或者 macOS 上的 Android Studio&#xff09;> Settings > Build, Exe…

LeetCode - #151 颠倒字符串中的单词

文章目录 前言1. 描述2. 示例3. 答案关于我们 前言 我们社区陆续会将顾毅&#xff08;Netflix 增长黑客&#xff0c;《iOS 面试之道》作者&#xff0c;ACE 职业健身教练。&#xff09;的 Swift 算法题题解整理为文字版以方便大家学习与阅读。 LeetCode 算法到目前我们已经更新…

图数据库 | 11、图数据库架构设计——高性能图存储架构(下)

在上篇内容中&#xff0c;老夫着重讲了高性能图存储系统的特点&#xff0c;咱们继续往下讲重点——高性能存储架构的设计思路&#xff01;&#xff01; 2.高性能存储架构设计思路 首先呢&#xff0c;存储架构以及核心数据结构的设计思路通常围绕如下4个维度来进行&#xff1a…