大数据面试题之Mysql:每日三题(五)

news2024/12/27 11:49:29

大数据面试题之Mysql:每日三题

  • 1.MySQL索引存储结构(六种)
  • 2.on和where的区别
  • 3.mysql是怎么查重的?(重点掌握3种,distinct,group by,row_number)

很开心写完上一篇,就立刻找到了我入职的第二家公司,所以我还是相信那一句话,越努力越幸运。

在这里插入图片描述

1.MySQL索引存储结构(六种)

Hash结构
Hash本身是一个函数,又被称为散列函数,它可以帮助我们大幅提升检索数据的效率。
Hash算法是通过某种确定性的算法(比如MD5,SHA1,SHA2,SHA3) 将输入转变为输出。`相同的输入永远可以得到相同的输出`,假设输入内容有微小偏差,在输出中通常会有不同的结果。
举例:如果你想验证两个文件是否相同,那么你不需要把两份文件直接拿来比对,只需要让对方把Hash函数计算得到的结果告诉你即可,然后在本地同样对文件进行Hash函数的运算,最后通过比较两个Hash函数的结果是否相同,就可以知道这两个文件是否相同。
加速查找速度的数据结构,常见的有两类:
(1)树,例如平衡二叉搜索数,查询/插入/修改/删除的平均时间复杂度都是O(log2N);
(2)哈希,例如HashMap,查询/插入/修改/删除的平均时间复杂度都是O(1);
采用Hash进行检索效率非常高,基本上一次检索就可以找到数据,而B+树需要自顶向下依次查找,多次访问节点才能找到数据,中间需要多次I/O操作,从效率来说Hash比B+树更快。
在哈希的方式下,一个元素k处于h(k)中,即利用哈希函数h,根据关键词k计算出槽的位置。函数h将关键字域映射到哈希表T[0...m-1]的槽位上。
哈希函数h有可能将两个不同的关键字映射到相同的位置,这叫碰撞,在数据库中一般采用链接法来解决。在链接法中,将散列到同一槽位的元素放在一个链表中。

二叉树
如果我们利用二叉树作为索引结构,那么磁盘的IO次数和索引树的高度是相关的。
为了提高查询效率,就需要减少磁盘IO数。为了减少磁盘IO的次数,就需要尽量降低树的高度,需要把原来“廋高”的树结构变的“矮胖”,树的每层的分叉越多越好。

AVL树
为了解决上面二叉查找树退化成链表的问题,人们提出了平衡二叉搜索树(Balanced Binary Tree),又称为AVL树(有别于AVL算法),它在二叉搜索树的基础上增加了约束,具有以下性质:
它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
解决二叉树数据有序时出现的线性插入树太深问题,树的深度会明显降低,极大提高性能,但是当数据量很大时,一般mysql中一张表达到3-5百万条数据是很普遍的,因此平衡二叉树的深度还是非常大,mysql读取时还是会消耗大量IO,不仅如此,计算从磁盘读取数据时以页(4KB)为单位的,及每次读取4096byte。平衡二叉树每个节点只保存了一个关键字(如int即4byte),浪费了4092byte,极大的浪费了读取空间。
你能看到此时树的高度降低了,当数据量N大的时候,以及树的分叉数M大的时候,M叉树的高度会远小于二叉树的高度(M>2)。所以,我们需要把树​​从“瘦高"变"矮胖”​。

B-树
解决平衡二叉树树深度的问题,解决了平衡二叉树读取消耗大量内存空间的问题。因为B-树每个节点可以存放多个关键字,最大限度的利用了从磁盘读取的内存空间,单节点存放多个关键字同时也大大减少了树的深度。极大的提高了mysql的查询性能。但是B-树还是有缺点,B-树对有范围查找的查询(如age>20)时采用的还是中序排序法,因此也需要多遍历,并且查询性能不稳定,比如查询(select * from table where id = 222 和 select * from table where id = 223)时在查询效率(耗时)上可能会存在一定的差别,因为B-树还是将关键字,这里为id,存放在根节点和叶节点的,如果运气好,可能id=222这个关键字就在第一个节点,消耗一次IO就找到了,而id=223可能在叶节点,需要消耗3次IO才能找到。因此B-树对同一条sql语句的查询性能可能会有很大影响(确实感觉有点扯,但是事实时这样)任何一个关键字出现且只出现在一个结点中,数据不一定在子节点上,也可能是父节点,交叉节点等等

B+树
将关键字全部存放在叶子节点(查询更稳定,同一条mysql语句执行效率时相同的,都会消耗3次IO),将相邻叶子节点的地址保存起来(相比于B-树,对于mysql的范围查找不用再使用中序查找,而是可以直接快读获取到。)

红黑树
树的高度随着数据量增加而增加,IO代价高。

总结如下:
hash:虽然可以快速定位,但是没有顺序,IO复杂度高。
二叉树:树的高度不均匀,不能自平衡,查找效率跟数据有关(树的高度),并且IO代价高。
红黑树:树的高度随着数据量增加而增加,IO代价高。
B-Tree: 矮胖型的树,IO效率相对其他要高,在范围查询时,需要获取所有节点进行遍历,效率相对低下
B+Tree对比B-Tree:数据都在叶子节点上,并且增加了顺序访问指针,每个叶子节点都指向相邻的叶子节点的地址。相比B-Tree来说,进行范围查找时只需要查找两个节点,进行遍历即可。而B-Tree需要获取所有节点,相比之下B+Tree效率更高。

所以说:mysql索引结构默认使用B+Tree,而不是hash,二叉树和红黑树

2.on和where的区别

on是先筛选后关联,where是先关联后筛选
1、on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。
2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

3.mysql是怎么查重的?(重点掌握3种,distinct,group by,row_number)

1.使用 DISTINCT 关键字:SELECT DISTINCT col1, col2 FROM table1; 该语句会选出表table1中col1和col2不重复的元组。

2.使用 GROUP BY 及聚合函数:SELECT col1, COUNT(col2) FROM table1 GROUP BY col1; 该语句会选出表table1中,以col1为基础,同时统计col2各值共有多少项的查询结果。

3.使用 UNION 关键字:SELECT col1 FROM table1 UNION SELECT col1 FROM table2; 该语句会选出表table1和table2中col1不重复的项,并把它们合并成一个数据集。

4.使用子查询:SELECT * FROM table1 WHERE col1 NOT IN (SELECT col1 FROM table2); 该语句会从表table1中选出col1与表table2中重复的项目剩余部分。

5.使用 JOIN 子句:SELECT * FROM table1 LEFT JOIN table2 ON table1.col1 = table2.col1 WHERE table2.col1 IS NULL; 该语句会找出两者之间的不同之处。除此之外,还有一些其他的方法可用于去重,如:

6.使用 EXISTS 和 NOT EXISTS 操作符:SELECT * FROM table1 t1 WHERE NOT EXISTS (SELECT * FROM table1 t2 WHERE t2.col1 = t1.col1 AND t2.id < t1.id); 该语句会选出col1不重复的行,并且只保留id最小的项。

7.使用 GROUP_CONCAT 和 FIND_IN_SET 函数:SELECT col1, GROUP_CONCAT(col2) AS col2_list FROM table1 GROUP BY col1 HAVING FIND_IN_SET('val', col2_list) = 0; 该语句会选出表table1中col1不重复的项,同时以逗号分隔符将它们对应的col2值合并成一个字符串,并检查该字符串中是否包含指定的关键字。

8.使用临时表和 INSERT INTO SELECT 语句: CREATE TEMPORARY TABLE tmp_table SELECT DISTINCT * FROM table1; SELECT * FROM tmp_table; 该语句会创建一个临时表tmp_table,将去重后的结果插入其中,然后从该临时表中查询数据。需要注意的是,该方法可能会影响性能和内存消耗。

9.使用子查询和LIMIT:SELECT col1 FROM table1 GROUP BY col1 HAVING COUNT(*) > 1 UNION SELECT col1 FROM table1 LIMIT 1; 该语句首先会找出表table1中col1重复的项,然后再将结果和第一项合并输出。

10.使用 PARTITION 分区:SELECT DISTINCT col1 FROM table1 PARTITION(partition_name);

11.使用ROW_NUMBER() OVER (PARTITION BY 去重字段 ORDER BY 排序字段)语法:  SELECT a.* FROM (  SELECT   ROW_NUMBER() OVER (PARTITION BY ID, item_no ORDER BY date desc ) as row_number,ID,item_no,date     FROM    table1) a WHERE   a.row_number = 1;

12.使用EXISTS(或NOT EXISTS)函数

在这里插入图片描述

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

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

相关文章

Gitlab保护分支与合并请求

目录 引言 1、成员角色指定 1、保护分支设置 2、合并请求 引言 熟悉了Git工作流之后&#xff0c;有几个重要的分支&#xff0c;如Master(改名为Main)、Develop、Release分支等&#xff0c;是禁止开发成员随意合并和提交的&#xff0c;在此分支上的提交和推送权限仅限项目负责…

电商假货品牌如何应对

随着电商的逐步发展&#xff0c;不同渠道首的产品上架数量呈明显增长&#xff0c;这些链接里会有经销商店铺&#xff0c;或者是非授权店铺&#xff0c;同时伴随的还会有低价、窜货、假货产品。假货大多是低价链接&#xff0c;面对线上逐渐增多的假货链接&#xff0c;品牌又该如…

C++ / QT 旅游产品管理系统

一、项目介绍 旅游产品管理系统 你是一家旅行社的 IT 主管&#xff0c;现在需要你设计并实现一个旅游产品管理系统。 1 &#xff09; 基本功能要求 * 实现基础界面&#xff1a; 参照现有的旅游产品管理系统&#xff1a;查看产品、选择产品、使用说明等内容 * 支持旅游产品…

【每日一题】Leetcode - 283. 移动零

题目 Leetcode - 283. 移动零 解题思路 从右向左遍历&#xff0c;遇到0&#xff0c;就将后面所有元素前移&#xff0c;同时更新长度&#xff0c;使其减1&#xff0c;因为移动n次&#xff0c;倒数n位就被0占据&#xff0c;后续操作可忽略 class Solution {public void moveZ…

G1吊舱全面升级,新增软件驱动库,支持多平台使用

G1吊舱&#xff0c;是我们去年推出的一款自研的云台产品&#xff0c;体积小巧&#xff0c;功能强大&#xff0c;上市后得到了很多朋友的支持。在上市后的一年期间&#xff0c;我们多方收集用户反馈&#xff0c;并基于用户的宝贵建议对G1吊舱进行了软硬件上的升级。 ​ 一、软件…

【ubuntu】【vmware tools】解决重启后看不到共享目录的问题

1、现象 ubuntu 22 vmware 16&#xff0c;安装后会发现 “Reinstall VMware Tools…” 灰色不可用。如图&#xff1a; 2、原因分析 ubuntu 22 ISO 内不再提供 VMware Tools 的安装包&#xff0c;未检测到所以灰色不可用 在 Ubuntu 22 上挂载 Windows HGFS 共享目录&#xff…

点成分享丨实验室磁力搅拌器的原理及应用

磁力搅拌器概述 磁力搅拌器是一种广泛应用于化学实验室、生物技术、制药和其他研究领域的实验室设备。在实验中&#xff0c;溶液需要混合均匀才能进行下一步的反应或测量。传统的方法是通过手动搅拌或机械搅拌来实现&#xff0c;但这些方法都有一定的缺陷&#xff0c;如不均匀、…

图解平衡二叉搜索树

gitee仓库&#xff1a;https://gitee.com/WangZihao64/data-structure-and-algorithm/tree/master/avl 有如下一棵树(采用加入左结点平衡因子-1&#xff0c;加入右结点平衡因子1的方式)&#xff1a; 插入有以下几种情况&#xff1a; 1.平衡因子变为2 2.平衡因子变为0 3.平衡因…

一个基于 SpringCloud 微服务架构的前后端分离博客系统

项目介绍 蘑菇博客( MoguBlog )&#xff0c;一个基于微服务架构的前后端分离博客系统。Web 端使用 Vue ElementUi , 移动端使用 uniapp 和 ColorUI。 后端使用 SpringCloud SpringBoot Mybatis-plus进行开发&#xff0c;使用 Jwt SpringSecurity 做登录验证和权限校验&am…

统计机器学习第十三章极大似然估计的性质——图解MLE的渐进正态性

n10; t10000; s1/12/n; xlinspace(-0.4,0.4,100); y1/sqrt(2*pi*s)*exp(-x.^2/(2*s)); zmean(rand(t,n)-0.5,2);figure(1); clf; hold on b20; hist(z,b); hplot(x,y*t/b*(max(z)-min(z)),r-);这段代码的功能是生成随机数并进行直方图和曲线的可视化。下面是每行代码的解释&…

[算法前沿]--028-基于Hugging Face -Transformers的预训练模型微调

1. 简介 本章节将使用 Hugging Face 生态系统中的库——🤗 Transformers来进行自然语言处理工作(NLP)。 Transformers的历史 以下是 Transformer 模型(简短)历史中的一些参考点: Transformer 架构于 2017 年 6 月推出。原始研究的重点是翻译任务。随后推出了几个有影响…

Chrome/Edge 浏览器多账号登录,测试同一业务系统的不同账号角色

文章目录 如何使用多账户&#xff1f;ChromeEdge 虽然说用不同浏览器测试也比较方便、还能顺带测试多浏览器兼容问题…… 但我是开发呀&#xff0c;我只想用我最习惯的谷歌浏览器完成快速开发&#xff0c;把功能铺上&#xff0c;专注于业务逻辑的开发 这些浏览器差异等只会给我…

RTSP/Onvif协议视频平台EasyNVR硬件无法进入服务器该如何解决?

EasyNVR是基于RTSP/Onvif协议的视频接入、处理及分发的安防视频云平台&#xff0c;可提供的视频能力包括&#xff1a;设备接入、实时视频直播、录像、云存储、录像回放与检索、告警、级联等&#xff0c;平台可支持将接入的视频流进行全平台、全终端的分发&#xff0c;分发的视频…

占空比任意方波的傅里叶级数展开

目录 傅里叶级数的复数形式占空比任意方波的傅里叶级数展开 常见的方波信号傅里叶级数展开都是占空比为50%&#xff0c;如方波信号傅里叶级数展开&#xff0c;但有的时候信号的占空比不一定是50%的信号&#xff0c;这时我们要对其进行傅里叶变换或者频谱推导的时候&#xff0c;…

Android应用权限请求步骤

1.在AndroidManifest.xml中配置请求权限 <uses-permission android:name"android.permission.READ_EXTERNAL_STORAGE"/><uses-permission android:name"android.permission.WRITE_EXTERNAL_STORAGE"/> 2.在onCreate(Bundle savedInstanceStat…

ffmpeg之linux编译

文章目录 一、下载源码二、选项说明三、依赖库四、编译安装 一、下载源码 上官网https://ffmpeg.org/download.html下载源码 二、选项说明 --disable-static&#xff1a;禁止构建静态库&#xff0c;默认关闭&#xff08;即默认构建的是静态库&#xff09;--enable-shared&a…

脉冲离子风棒的工作原理、特点及其应用

脉冲离子风棒是一种独特的清洁工具&#xff0c;它利用高能离子风的冲击力&#xff0c;可以快速而彻底地清洁物体表面静电。本文将介绍脉冲离子风棒的工作原理、特点以及其在清洁领域的应用。 脉冲离子风棒的工作原理是利用高能脉冲电场将气体中的分子电离&#xff0c;并产生离子…

OpenText 企业内容管理平台的亮点及优势

OpenText Extended ECM 平台 将内容服务与领先应用程序集成&#xff0c;以弥合内容孤岛、加快信息流并扩大治理 什么是内容服务集成&#xff1f; 内容服务集成通过将内容管理平台与处于流程核心的独立应用程序和系统连接起来&#xff0c;支持并扩展了 ECM 的传统优势。 最好的…

Itext 7 生成pdf带有背景图

Itext 7 生成pdf带有背景图并下载PDF到本地 引入jar包 <dependency><groupId>com.itextpdf</groupId><artifactId>itext7-core</artifactId><version>7.0.3</version><type>pom</type></dependency>代码实现 Get…

unity场景名对象在Inspector面板以下拉列表显示

unity场景名对象在Inspector面板以下拉列表形式显示&#xff0c;避免输入错误。 首先创建一个类用来获取BuildSetting中场景列表中的所有场景名字 public class MSceneName : PropertyAttribute {/// <summary>/// 场景名列表/// </summary>public string[] Name…