mysql、redis面试题

mysql 相关

1、数据库优化查询方法

	外键、索引、联合查询、选择特定字段等等

2、简述mysql和redis区别

	redis: 内存型非关系数据库,数据保存在内存中,速度快mysql:关系型数据库,数据保存在磁盘中,检索的话,会有一定的Io操作,访问速度相对慢

3、列出常见MYSQL数据存储引擎

	InnoDB:支持事务处理,支持外键,支持崩溃修复能力和并发控制。如果需要对事务的完整性要求比较高(比如银行),要求实现并发控制(比如售票),那选择InnoDB有很大的优势。如果需要频繁的更新、删除操作的数据库,也可以选择InnoDB,因为支持事务的提交(commit)和回滚(rollback)。MyISAM:插入数据快,空间和内存使用比较低。如果表主要是用于插入新记录和读出记录,那么选择MyISAM能实现处理高效率。如果应用的完整性、并发性要求比 较低,也可以使用。MEMORY:所有的数据都在内存中,数据的处理速度快,但是安全性不高。如果需要很快的读写速度,对数据的安全性要求较低,可以选择MEMOEY。它对表的大小有要求,不能建立太大的表。所以,这类数据库只使用在相对较小的数据库表。

4、日常工作中你是怎么优化SQL的?

	加索引--避免返回不必要的数据--适当分批量进行--优化sql结构--分库分表--读写分离

5、说说分库与分表的设计

	水平分库:以字段为依据,按照一定策略(hashrange等),将一个库中的数据拆分到多个库中水平分表:以字段为依据,按照一定策略(hashrange等),将一个表中的数据拆分到多个表中。垂直分库:以表为依据,按照业务归属不同,将不同的表拆分到不同的库中。垂直分表:以字段为依据,按照字段的活跃性,将表中字段拆到不同的表(主表和扩展表)中。

6、事务的隔离级别有哪些?MySQL的默认隔离级别是什么?

	读未提交(Read Uncommitted)读已提交(Read Committed)可重复读(Repeatable Read)串行化(Serializable)Mysql默认的事务隔离级别是可重复读(Repeatable Read),其他数据库一般默认为读已提交。(我们可以把mysql的默认隔离级别修改为读已提交,这句话面试官不问不要说,不要给自己挖坑)

7、什么是幻读,脏读,不可重复读呢?

	事务A、B交替执行,事务A被事务B干扰到了,因为事务A读取到事务B未提交的数据,这就是脏读在一个事务范围内,两个相同的查询,读取同一条记录,却返回了不同的数据,这就是不可重复读。事务A查询一个范围的结果集,另一个并发事务B往这个范围中插入/删除了数据,并静悄悄地提交,然后事务A再次查询相同的范围,两次读取得到的结果集不一样了,这就是幻读。

8、说一下数据库的三大范式

	第一范式:数据表中的每一列(每个字段)都不可以再拆分第二范式:在第一范式的基础上,分主键列完全依赖于主键,而不能是依赖于主键的一部分第三范式:在满足第二范式的基础上,表中的非主键只依赖于主键,而不依赖于其他非主键

9、索引有哪几种类型?

	主键索引: 数据列不允许重复,不允许为NULL,一个表只能有一个主键。唯一索引: 数据列不允许重复,允许为NULL值,一个表允许多个列创建唯一索引。普通索引: 基本的索引类型,没有唯一性的限制,允许为NULL值。全文索引:是目前搜索引擎使用的一种关键技术,对文本的内容进行分词、搜索覆盖索引:查询列要被所建的索引覆盖,不必读取数据行组合索引:多列值组成一个索引,用于组合搜索,效率大于索引合并

10、创建索引有什么原则呢?

	最左前缀匹配原则频繁作为查询条件的字段才去创建索引频繁更新的字段不适合创建索引索引列不能参与计算,不能有函数操作优先考虑扩展索引,而不是新建索引,避免不必要的索引在order by或者group by子句中,创建索引需要注意顺序区分度低的数据列不适合做索引列(如性别)定义有外键的数据列一定要建立索引。对于定义为text、image数据类型的列不要建立索引。删除不再使用或者很少使用的索引

11、什么是数据库事务?

	数据库事务(简称:事务),是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。

12、mysql 事务的特性,ACID

	原子性、一致性、隔离性、持久性

13、B树和B+树的区别?

	1、B-树是一类树,包括B-树、B+树、B*树等,是一棵自平衡的搜索树,它类似普通的平衡二叉树,不同的一点是B-树允许每个节点有更多的子节点。B-树是专门为外部存储器设计的,如磁盘,它对于读取和写入大块数据有良好的性能,所以一般被用在文件系统及数据库中。2、B+树是B-树的变体,也是一种多路搜索树, 它与 B- 树的不同之处在于:所有关键字存储在叶子节点出现,内部节点(非叶子节点并不存储真正的 data)为所有叶子结点增加了一个链指针因为内节点并不存储 data,所以一般B+树的叶节点和内节点大小不同,而B-树的每个节点大小一般是相同的,为一页

14、mysql 行锁

	MySQL的行锁又分为共享锁(S锁)和排他锁(X锁)。一般普通的select语句,InnoDB不加任何锁,我们称之为快照读select * from test;通过加S锁和X锁的select语句或者插入/更新/删除操作,我们称之为当前读select * from test lock in share mode;select * from test for update;insert into test values();update test set;delete from test …;以上的当前读,读取的都是记录的最新版本。对读取记录都会加锁,除了第一条语句lock in share mode是对记录加S锁(共享锁)外,其他的操作都是加X锁(排他锁)。

15、什么是死锁?怎么解决?

死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方的资源,
从而导致恶性循环的现象
常见的解决死锁的方法如果不同程序会并发存取多个表, 尽量约定以相同的顺序访问表,可以大大降低死锁机会。
在同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁产生概率;
对于非常容易产生死锁的业务部分,可以尝试使用升级锁定颗粒度,
通过表级锁定来减少死锁产生的概率;

16、什么是脏读?幻读?不可重复读?

脏读(Drity Read):某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作,则后一个事务所读取的数据就会是不正确的。不可重复读(Non-repeatable read):在一个事务的两次查询之中数据不一致, 
这可能是两次查询过程中间插入了一个事务更新的原有的数据。幻读(Phantom Read):在一个事务的两次查询中数据笔数不一致, 
例如有一个事务查询了几列(Row)数据, 而另一个事务却在此时插入了新的几列数据,
先前的事务在接下来的查询中, 就会发现有几列数据是它先前所没有的。

17、索引有哪些使用场景

1)、应该创建索引的场景
主键应该创建主键索引。
频繁作为查询条件的字段应该创建索引。
查询中需要与其他表进行关联的字段应该创建索引。
需要排序的字段应该创建索引。
需要统计或分组的字段应该创建索引。
优先考虑创建复合索引。2)、不应创建索引的场景
数据记录较少的表。
经常需要增删改操作的字段。
数据记录重复较多且分布平均的字段(如性别、状态等)。

redis 相关

1、redis 是单线程还是多线程?

大家所熟知的 Redis 确实是单线程模型,指的是执行 Redis 命令的核心模块是单线程的,
而不是整个 Redis 实例就一个线程,Redis 其他模块还有各自模块的线程的

2、Redis 不仅仅是单线程


一般来说 Redis 的瓶颈并不在 CPU,而在内存和网络。如果要使用 CPU 多核,
可以搭建多个 Redis 实例来解决。
其实,Redis 4.0 开始就有多线程的概念了,比如 Redis 通过多线程方式在后台删除对象、
以及通过 Redis 模块实现的阻塞命令等。

3、Redis系列 | 缓存穿透、击穿、雪崩、预热、更新、降级

缓存穿透

当查询Redis中没有的数据时,该查询会下沉到数据库层,同时数据库层也没有该数据,
当这种情况大量出现或被恶意攻击时,接口的访问全部透过Redis访问数据库,
而数据库中也没有这些数据,我们称这种现象为"缓存穿透"。解决方案:
在接口访问层对用户做校验,如接口传参、登陆状态、n秒内访问接口的次数;
利用布隆过滤器,将数据库层有的数据key存储在位数组中,
以判断访问的key在底层数据库中是否存在;

缓存击穿

缓存击穿和缓存穿透从名词上可能很难区分开来,它们的区别是:
穿透表示底层数据库没有数据且缓存内也没有数据,击穿表示底层数据库有数据而缓存内
没有数据。当热点数据key从缓存内失效时,大量访问同时请求这个数据,
就会将查询下沉到数据库层,此时数据库层的负载压力会骤增,
我们称这种现象为"缓存击穿"。解决方案:
延长热点key的过期时间或者设置永不过期,如排行榜,首页等一定会有高并发的接口;
利用互斥锁保证同一时刻只有一个客户端可以查询底层数据库的这个数据,
一旦查到数据就缓存至Redis内,避免其他大量请求同时穿过Redis访问底层数据库;

缓存雪崩

缓存雪崩是缓存击穿的"大面积"版,缓存击穿是数据库缓存到Redis内的热点数据失效
导致大量并发查询穿过redis直接击打到底层数据库,而缓存雪崩是指Redis中
大量的key几乎同时过期,然后大量并发查询穿过redis击打到底层数据库上,
此时数据库层的负载压力会骤增,我们称这种现象为"缓存雪崩"。解决方案:
在可接受的时间范围内随机设置key的过期时间,分散key的过期时间,
以防止大量的key在同一时刻过期;
对于一定要在固定时间让key失效的场景(例如每日12点准时更新所有最新排名),
可以在固定的失效时间时在接口服务端设置随机延时,将请求的时间打散,
让一部分查询先将数据缓存起来;
延长热点key的过期时间或者设置永不过期,这一点和缓存击穿中的方案一样;

缓存预热

缓存预热如字面意思,当系统上线时,缓存内还没有数据,如果直接提供给用户使用,
每个请求都会穿过缓存去访问底层数据库,如果并发大的话,很有可能在上线当天就会宕机,
因此我们需要在上线前先将数据库内的热点数据缓存至Redis内再提供出去使用,
这种操作就成为"缓存预热"。
缓存预热的实现方式有很多,比较通用的方式是写个批任务,
在启动项目时或定时去触发将底层数据库内的热点数据加载到缓存内。

缓存更新

缓存服务(Redis)和数据服务(底层数据库)是相互独立且异构的系统,
在更新缓存或更新数据的时候无法做到原子性的同时更新两边的数据,
因此在并发读写或第二步操作异常时会遇到各种数据不一致的问题。
缓存更新的设计模式有四种:
Cache aside:查询:先查缓存,缓存没有就查数据库,然后加载至缓存内;
更新:先更新数据库,然后让缓存失效;或者先失效缓存然后更新数据库; Read through:在查询操作中更新缓存,即当缓存失效时,Cache Aside 模式是由
调用方负责把数据加载入缓存,而 Read Through 则用缓存服务自己来加载;Write through:在更新数据时发生。当有数据更新的时候,如果没有命中缓存,
直接更新数据库,然后返回。如果命中了缓存,则更新缓存,然后由缓存自己更新数据库; Write behind caching:俗称write back,在更新数据的时候,只更新缓存,
不更新数据库,缓存会异步地定时批量更新数据库;

缓存降级

缓存降级是指当访问量剧增、服务出现问题(如响应时间慢或不响应)或
非核心服务影响到核心流程的性能时,即使是有损部分其他服务,
仍然需要保证主服务可用。可以将其他次要服务的数据进行缓存降级,
从而提升主服务的稳定性。

Redis 能够处理速度快的原因主要有以下几个方面:

	1、内存数据库:Redis是一种内存数据库,数据存储在内存中,因此读写速度非常快。2、单线程:Redis是单线程的,避免了多线程带来的上下文切换和锁竞争的开销,因此可以更高效地利用CPU资源。3、非阻塞式IO:Redis使用了非阻塞式IO,当执行一个IO操作时,它不会被阻塞,而是会立即返回,这样就可以执行其他操作,提高了Redis的响应速度。4、基于事件驱动:Redis采用了基于事件驱动的模型,通过监听socket事件,当事件发生时,执行相应的操作,避免了轮询的开销,提高了Redis的性能。5、轻量级:Redis的代码量相对较小,且没有复杂的依赖关系,因此它的启动速度非常快,这也是它处理速度快的重要原因之一。综上所述,Redis之所以能够处理速度快,是因为它采用了多种优化策略和技术,从而实现了高效的数据存储和快速的读写操作。

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

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

相关文章

[Go版]算法通关村第十二关黄金——字符串冲刺题

目录 题目:最长公共前缀解法1:纵向对比-循环内套循环写法复杂度:时间复杂度 O ( n ∗ m ) O(n*m) O(n∗m)、空间复杂度 O ( 1 ) O(1) O(1)Go代码 解法2:横向对比-两两对比(类似合并K个数组、合并K个链表)复…

okhttp下载文件 Java下载文件 javaokhttp下载文件 下载文件 java下载 okhttp下载 okhttp

okhttp下载文件 Java下载文件 javaokhttp下载文件 下载文件 java下载 okhttp下载 okhttp 1、引入Maven1.1、okhttp发起请求官网Demo 2、下载文件3、扩充,读写 txt文件内容3.1读写内容 示例 http客户端 用的是 okhttp,也可以用 UrlConnetcion或者apache …

SD WebUI 扩展:prompt-all-in-one

sd-webui-prompt-all-in-one 是一个基于 Stable Diffusion WebUI 的扩展,旨在提高提示词/反向提示词输入框的使用体验。它拥有更直观、强大的输入界面功能,它提供了自动翻译、历史记录和收藏等功能,它支持多种语言,满足不同用户的…

[MAUI]在.NET MAUI中实现可拖拽排序列表

文章目录 创建可拖放控件创建绑定服务类拖拽(Drag)拖拽悬停,经过(DragOver)释放(Drop) 创建页面元素最终效果项目地址 .NET MAUI 中提供了拖放(drag-drop)手势识别器,允许用户通过拖…

Mysql驱动包下载

第一步:下载地址 MySQL :: Download Connector/J 第二步: 第三步: 第四步:解压 第五步:找到驱动包,放入项目使用即可

管理类联考——逻辑——真题篇——按知识分类——汇总篇——三、综合推理

文章目录 题-综合推理-分类1-排序真题(2016-54-55)-难度最高*****-综合推理-分类1-排序-画表排除法真题(2016-54)真题(2016-55)真题(2019-36)-综合推理-分类1-排序真题(2…

【AIGC】 国内版聊天GPT

国内版聊天GPT 引言一、国内平台二、简单体验2.1 提问2.2 角色扮演2.3 总结画图 引言 ChatGPT是OpenAI发开的聊天程序,功能强大,可快速获取信息,节省用户时间和精力,提供个性化的服务。目前国产ChatGPT,比如文心一言&a…

OJ练习第151题——克隆图

克隆图 力扣链接:133. 克隆图 题目描述 给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆)。 示例 分析 对于一张图而言,它的深拷贝即构建一张与原图结构,值均一样的图,但是…

C++中的类型擦除技术

文章目录 一、C类型擦除Type Erasure技术1.虚函数2.模板和函数对象 二、任务队列1.基于特定类型的方式实现2.基于任意类型的方式实现 参考: 一、C类型擦除Type Erasure技术 C中的类型擦除(Type Erasure)是一种技术,用于隐藏具体类…

Electron基础篇

人生有些事,错过一时,就错过一世。 官网:简介 | Electron Electron-大多用来写桌面端软件 Electron介绍 Electront的核心组成是Chromium、Node.js以及内置的Native API,其中Chromium为Electron提供强大的UI能力,可以在不考虑兼容的情况下利…

使用神卓互联内网穿透搭建远程访问公司ERP系统

神卓互联是一款企业级内网穿透软件,可以将内网中的服务映射到公网上,实现内网服务的访问。通过神卓互联,您可以远程访问ERP系统。在使用神卓互联进行内网穿透时,您只需要在生成的公网地址后面加上ERP系统的端口号,即可…

NVIDIA vGPU License许可服务器高可用全套部署秘籍

第1章 前言 近期遇到比较多的场景使用vGPU,比如Citrix 3D场景、Horizon 3D场景,还有AI等,都需要使用显卡设计研发等,此时许可服务器尤为重要,许可断掉会出现掉帧等情况,我们此次教大家部署HA许可服务器。 …

【.net】本地调试运行只能用localhost的问题

【.net】本地调试运行只能用localhost的问题 解决方案 找到到项目目录下 隐藏文件夹 .vs /项目名称/config/applicationhost.config <bindings><binding protocol"http" bindingInformation"*:1738:localhost" /></bindings> 再加一条你…

职业学院物联网实训室建设方案

一、概述 1.1专业背景 物联网&#xff08;Internet of Things&#xff09;被称为继计算机、互联网之后世界信息产业第三次浪潮&#xff0c;它并非一个全新的技术领域&#xff0c;而是现代信息技术发展到一定阶段后出现的一种聚合性应用与技术提升&#xff0c;是随着传感网、通…

如何判断自己是否适合游戏开发?

引言 游戏开发是一个充满创意和技术挑战的领域&#xff0c;吸引着越来越多的年轻人投身其中。然而&#xff0c;要想在游戏开发领域获得成功&#xff0c;首先需要明确自己是否适合这个领域。本文将为你介绍一些判断自己是否适合游戏开发的关键因素。 1. 技术兴趣和编程能力 游…

Python 程序设计入门(024)—— Python 的文件操作

Python 程序设计入门&#xff08;024&#xff09;—— Python 的文件操作 目录 Python 程序设计入门&#xff08;024&#xff09;—— Python 的文件操作一、文件对象二、读取文件内容的方法1、read() 方法2、readline() 方法3、readlines() 方法4、使用 for 循环读取文件内容 …

麦肯锡发布《2023科技趋势展望报告》,生成式AI、下一代软件开发成为趋势,软件测试如何贴合趋势?

近日&#xff0c;麦肯锡公司发布了《2023科技趋势展望报告》。报告列出了15个趋势&#xff0c;并把他们分为5大类&#xff0c;人工智能革命、构建数字未来、计算和连接的前沿、尖端工程技术和可持续发展。 类别一&#xff1a;人工智能革命 生成式AI 生成型人工智能标志着人工智…

CSRF

文章目录 CSRF(get)CSRF(post)CSRF Token CSRF(get) 根据提示的用户信息登录 点击修改个人信息 开启bp代理&#xff0c;点击submit 拦截到请求数据包 浏览器关闭代理 刷新页面 CSRF(post) 使用BP生成CSRF POC post请求伪造&#xff0c;可以通过钓鱼网站&#xff0c;诱导用户去…

docker 常用命令大全

1.查看docker版本&#xff1a; docker -v2.检查 Docker 是否正在运行: systemctl status docker3.重启docker服务: systemctl restart docker4.列出本地镜像: docker images5.列出正在运行的容器&#xff1a; docker ps6.列出所有容器&#xff08;包括停止的&#xff09;&…

css 实现文字横向循环滚动

实现效果 思路 ## 直接上代码,html部分 //我这里是用的uniapp <view class"weather_info_wrap"><view class"weather_info">当前多云&#xff0c;今晚8点转晴&#xff0c;明天有雨&#xff0c;温度32摄氏度。</view><view class&qu…