MySQL 数据库面试题

news2024/10/6 8:31:30

@TOC

1. MySQL 的内连接、左连接、右连接有有什么区别?

在这里插入图片描述
inner join 内连接,在两张表进行连接查询时,只保留两张表中完全匹配的结果集。
left join 在两张表进行连接查询时,会返回左表所有的行,即使在右表中没有匹配的记录。
right join 在两张表进行连接查询时,会返回右表所有的行,即使在左表中没有匹配的记录。

varchar与char的区别?

在这里插入图片描述

charvarchar
char表示定长字符串,长度是固定的;如果插入数据的长度小于char的固定长度时,则用空格填充;varchar表示可变长字符串,长度是可变的;插入的数据是多长,就按照多长来存储;
对于char来说,最多能存放的字符个数为255,和编码无关对于varchar来说,最多能存放的字符个数为65532
因为长度固定,所以存取速度要比varchar快很多,甚至能快50%,但正因为其长度固定,所以会占据多余的空间,是空间换时间的做法;varchar在存取方面与char相反,它存取慢,因为长度不固定,但正因如此,不占据多余的空间,是时间换空间的做法;

日常的设计,对于长度相对固定的字符串,可以使用char,对于长度不确定的,使用varchar更合适一些。

DATETIME和TIMESTAMP的异同?

相同点
两个数据类型存储时间的表现格式一致。均为 YYYY-MM-DD HH:MM:SS
两个数据类型都包含「日期」和「时间」部分。
不同点

DATETIMETIMESTAMP
日期范围1000-01-01 00:00:00.000000 到 9999-12-31 23:59:59.9999991970-01-01 00:00:01.000000 UTC 到 2038-01-09 03:14:07.999999 UTC
时区相关存储时间与时区无关存储时间与时区有关,显示的值也依赖于时区
存储空间8 字节4 字节
默认值默认值为 nullTIMESTAMP 的字段默认不为空(not null),默认值为当前时间(CURRENT_TIMESTAMP)

MySQL中 in 和 exists 的区别?

如果查询的两个表大小相当,那么用in和exists差别不大。
如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in(小表驱动大表)。

举例:
select * from A where id in(select id from B),当B表的数据集必须小于A表的数据集时,用in优于exists。
select *from A where exists (select 1 from B where b.id=a.id)。当A表的数据集小于B表的数据集时,用exists优于in。

SQL join查询为什么要小表驱动大表?

mysql的join实现原理是,以驱动表的数据为基础,“嵌套循环”去被驱动表匹配记录,
select * from a join b on a.bid =b.id
假设 a表10000数据,b表20数据
这里有2个过程,b 表数据最少,查询引擎优化选择b为驱动表,
循环b表的20条数据,
去a表的10000数据去匹配,这个匹配的过程是B+树的查找过程,比循环取数要快的多

小表驱动的方式

for  20条数据
   匹配10000数据(根据on a.bid=b.id的连接条件,进行B+树查找)

查找次数 20+ log10000

大表驱动的方式

for 10000条数据
    匹配20条数据(根据on a.bid=b.id的连接条件,进行B+树查找)

查找次数 10000+ log20

结论

可以看出来
小表驱动大表:20+ log10000
大表驱动小表:10000+ log20
显然小表驱动大表查询效率要高很多。

MySQL怎么存储emoji ?

MySQL可以直接使用字符串存储emoji。
但是需要注意的,utf8 编码是不行的,MySQL中的utf8是阉割版的 utf8,它最多只用 3 个字节存储字符,所以存储不了表情。

需要使用utf8mb4编码。
alter table blogs modify content text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci not null;

drop、delete与truncate的区别?

在这里插入图片描述
因此,在不再需要一张表的时候,用drop;在想删除部分数据行时候,用delete;在保留表而删除所有数据的时候用truncate。

UNION与UNION ALL的区别?

在这里插入图片描述

count(1)、count(*) 与 count(列名) 的区别?

MySQL日志文件有哪些?分别介绍下作用?

binlog 日志

二进制日志(binary log ),记录对 Mysql 数据库执行的所有 更改操作,包括 表结构的变更 和 表数据的修改 等,像 select 这种查询是不会记录 binlog 日志的。
binlog 日志采用 追加写 的方式写文件,一个文件写满后新写一个文件,仅在 事务提交前 进行一次写入。
生成的 binlog 日志文件可以用于 备份恢复、主从复制 以及 数据审计 等用途。

binlog 参数配置

binlog 日志默认是没有启动的,可以通过配置参数 log-bin 或 log_bin 来开启,开启 binlog 日志后,还有许多相关的参数可以做配置,这里捡几个重要的看下:
max_binlog_size:指定单个日志文件的最大值,达到阈值后,会生成一个新的日志文件,后缀名 +1,并记录到 .index 文件,形如 mysql-bin.000001、mysql-bin.000002 …
binlog_cache_size日志缓存区大小。在事务未提交前,所有的 binlog 日志都会记录到内存缓存,等到事务提交的时候再写入日志文件,该参数即是设置该缓存区的大小。此外,日志缓存是基于会话的,也就是说 每个线程都有一块 binlog_cache_size 大小的内存缓存,因此,该值不宜设置太大;另一方面,如果某事务占用缓存超过设置值,就需要将日志写入临时文件,因此,该值也不能设置太小。那多大比较合适?可以通过 SHOW GLOBAL STATUS 查看 binlog_cache_disk_use (使用临时文件写日志次数)来判定,如果该值很大,说明缓存区过小,需要经常写临时文件,此时需要适当调大该参数。
sync_binlog同步磁盘策略。我们平时写文件调用的 write() 函数其实并没有真正的将内容写到磁盘,而是写到文件系统的 page cache 里,真正将内容同步到磁盘的是 fsync() 函数。sync_binlog 就是用来设置 fsync() 函数的执行时机的:
sync_binlog = 0 : 不调用 fsync() 函数,由操作系统决定何时调用;
sync_binlog = 1 : 每个事务调用 write() 后立马执行 fsync() 函数;
sync_binlog = N (N>1) : 累计 N 个事务调用 write() 后,执行 fsync() 函数
binlog_format:日志格式,有三种格式选择STATEMENT、ROW、MIXED。默认是STATEMENT。

binlog和redo log有什么区别?

redo log是属于innoDB层面,binlog属于MySQL Server层面的,这样在数据库用别的存储引擎时可以达到一致性的要求。
redo log是物理日志,记录该数据页更新的内容;binlog是逻辑日志,记录的是这个更新语句的原始逻辑
redo log是循环写,日志空间大小固定;binlog是追加写,是指一份写到一定大小的时候会更换下一个文件,不会覆盖。
binlog可以作为恢复数据使用,主从复制搭建,redo log作为异常宕机或者介质故障后的数据恢复使用。

说一下数据库的三大范式?

三大范式的作用是为了控制数据库的冗余,是对空间的节省,实际上,一般互联网公司的设计都是反范式的,通过冗余一些数据,避免跨表跨库,利用空间换时间,提高性能。
在这里插入图片描述
第一范式:数据表中的每一列(每个字段)都不可以再拆分。 例如用户表,用户地址还可以拆分成国家、省份、市,这样才是符合第一范式的。
第二范式:在第一范式的基础上,非主键列完全依赖于主键,而不能是依赖于主键的一部分。 例如订单表里,存储了商品信息(商品价格、商品类型),那就需要把商品ID和订单ID作为联合主键,才满足第二范式。
第三范式:在满足第二范式的基础上,表中的非主键只依赖于主键,而不依赖于其他非主键。 例如订单表,就不能存储用户信息(姓名、地址)。

三级目录

小表驱动大表:https://blog.csdn.net/weixin_47104688/article/details/120238004
SQL join查询为什么要小表驱动大表?:https://www.cnblogs.com/hellotin/p/14227664.html
redolog/binlog:https://blog.csdn.net/LIFE_PLAN/article/details/126964034
https://blog.csdn.net/Xeroxo/article/details/119888551

来源:https://www.zhihu.com/question/486105337/answer/2538190061

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

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

相关文章

STM32F401RET6 LQFP64 (Nucleo-F401RE) uart 打印输出

STM32F401RET6 LQFP64 (Nucleo-F401RE) uart 打印输出 1.STM32F401RET6 芯片情况 2.板子硬件 电源部分,开发板可利用JP5跳帽座子来选择使用USB供电或者使用管脚座子的外部Vin进行供电,无论是哪种供电,都需要经过U4的5V转成3.3V的LDO的再给S…

Simulink中如何获取所需变量对应的时间,并实时传输给其他模块

假设需要将时间信息传输给一个显示器模块,可以按照以下步骤进行操作: 在模型中添加“Clock”模块,将其输出与MATLAB函数“simulinktime”模块进行连接。 在模型中添加一个Scope模块,将其输入与Clock模块的输出进行连接。 运行模型,Scope模块将显示当前的仿真时间。 将Scop…

2023自动化测试选择什么工具或者框架好呢?

自动化测试的工具或者框架在市场上种类是比较繁多的。那么作为软件测试开发者应该怎么去选择呢?笔者觉得可以从测试需求、测试用例复杂度、技能水平和预算等方面去考虑。 Selenium 这是最常用的自动化测试工具之一,它可以模拟用户在不同的浏览器中进行操…

工厂人员定位系统源码,支持智能考勤、工时统计、行为检测、历史轨迹回放、人员管理、电子围栏功能

系统概述: 工厂人员定位系统,采用UWB定位技术,通过在厂区内部署一定数量的定位基站,以及为人员、车辆、物资佩戴标签卡的形式,实时获取人员精确位置,精度高达10cm。 工厂人员定位系统可实现物资/车辆实时定…

【Linux】】Linux权限的理解

一.Linux中的用户 Linux中分为两种用户,分别为: 1.root 用户,也叫超级用户,它的权限非常高,不受其他权限的约束,也就是可以为所欲为; 2.普通用户:除了root用户外,都是普通…

【2023春招】4399 web后台-Java后端开发

目录 一、JVM1.类加载过程2.static和final变量的初始化时机 二、依赖1.Spring Boot 自动装配2.使用依赖过程中遇到问题如何排查3.引入的某个依赖不符合预期,如何处理 三、数据库:1.InnoDB 和 MyISAM 索引的区别2.字符串类型字段,WHERE 数字&a…

枚举【Java】

文章目录 枚举的使用switch语句Enum类的常用方法枚举的构造方法 反射与枚举 在之前的学习中,如果我们需要组织一组枚举类型的数据,我们通常会使用常量来进行定义。但这种定义方式存在一个问题就是:如果在一个程序中,普通常量和使用…

1053 Path of Equal Weight(超级无敌详细注释+45行代码)

分数 30 全屏浏览题目 切换布局 作者 CHEN, Yue 单位 浙江大学 Given a non-empty tree with root R, and with weight Wi​ assigned to each tree node Ti​. The weight of a path from R to L is defined to be the sum of the weights of all the nodes along the pa…

UE5.1.1C++从0开始(6.两个额外的魔法弹:瞬移魔法弹和黑洞魔法弹)

做完这两个功能总共花费了一个下午加一个晚上的时间,瞬移魔法弹难度较低,黑洞魔法可能我的理解有误导致消耗时间较长,我会在下面把踩的坑写出来。 加上这个作业,我们一共做了三个魔法子弹了。同时那个老师也说我们可以写一个父类…

js中各种运算符

文章目录 扩展运算符:...逻辑运算符(&& 或 || )第一、&& (逻辑与)运算,看一个简单的例子:第二、|| (逻辑或)运算,看一个简单的例子:三、&& (逻辑与) 和||(逻…

JMX vs JFR:谁才是最强大的JVM监控利器?

大家好,我是小米!今天我们来聊一聊JVM监控系统,特别是关于JMX和JFR的使用。你是否有过在线上应用出现性能问题时,无法准确获取关键指标的困扰呢?那么,不妨听听我给大家带来的解决方案。 什么是JMX 首先&a…

什么是CTF?打CTF的意义是什么?(附网络安全入门教程)

什么是CTF? CTF在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式。它起源于1996年DEFCON全球黑客大会,以代替之前黑客们通过互相发起真实攻击进行技术比拼的方式。发展至今,已经成为全球范围网络安全圈流行的竞赛形式&#xff0…

使用mkdocs快速部署上线静态站点到Github

背景 mkdocs是一种方便地生成站点的工具,相比hugo、hexo等个人博客而言,mkdocs更加简便、轻量级,可以快速帮助部署上线类似个人技术本(notebook,wiki)之类的站点。并且支持默认支持站点内搜索,…

网络安全自学路线

很多人上来就说想学习黑客,但是连方向都没搞清楚就开始学习,最终也只是会无疾而终!黑客是一个大的概念,里面包含了许多方向,不同的方向需要学习的内容也不一样。 算上从学校开始学习,已经在网安这条路上走…

基于ensp的mpls vpn跨域optionA方案(分公司之间不能互访但是能访问总部场景)

目录 一 实验拓扑 二 实验要求 三 实验分析 四 实验配置说明 4.1完成正常ip地址配置,ISP内部使用ospf协议和mpls ldp协议 4.2 PE和CE之间起ebgp邻居 4.3 PE和PE之间起mpbgp邻居 4.4 PE和CE、ASBR之间设置VRF来进行RT值的过滤,选择合适的RT值来完…

网络编程:TCP socket

文章目录 阅读前导 服务端定义日志框架成员属性服务端框架 初始化服务器创建套接字绑定开启监听 运行服务器netstat 工具获取连接和通信准备通信逻辑 单进程服务端函数(version1)telent 工具测试 多进程服务端(version2)创建子进程…

手把手教你学习IEC104协议和编程实现 十四-文件操作之目录操作

文件服务也算是最后一个系统的大章节了。早期的IEC104软件仅实现了基本的通讯,也就是我们常说的3遥,对于定值和文件的操作都很少提及。 首先我们先要看看文件都包含那些。 文件包含的内容 故障录波文件 故障录波文件我们单独开一章来讲解。包含通讯及文件的格式 历史数据…

多核系统内存假共享问题

多核处理器(SMP)系统中, 每一个处理器都有一个本地高速缓存。内存系统必须保证高速缓存的一致性。当不同处理器上的线程修改驻留再同一高速缓存中的变量时就会发生假共享(false sharing),结果导致高速缓存无效,并强制更…

长期封闭环境中与积极情绪相关的肠道菌群

谷禾健康 近年来,随着微生物群-肠-脑轴研究的深入,越来越多证据表明,微生物群-肠-脑轴在调节大脑功能方面发挥着关键作用,尤其是在情绪处理和行为方面。然而,肠道微生物群与长期封闭环境中的心理变化之间的相关性仍知之…

小魔推助力实体行业短视频创作,打爆UGC素人流量!

最近不止一次的和大家讲到UGC的玩法,相信很多朋友也有了一定的认知,UGC简单来说,就是通过用户来生产原创内容,通过实体店的门头、环境、特色服务等相关内容,并且带有门店地址发布,就可以提升实体商家的POI热…