阿里一面,给了几条SQL,问需要执行几次树搜索操作?

mysql查询表记录总数 最快查询表总数查询千万级数据SELECT count(0)查询超时如何快速的查询Mysql表总数 前言 目前接到数据归档的需求进行处理。处理平台数据归档的事情。需要统计每张表的数据,后续做分库分表,因为数据量早就过千万,甚至三张表已经过亿了。所以需要先统计数据,但是在这里却遇到了一个问题。就是查询总数耗时太久超时了,因为数据量太大(很多表都是过千万,),而且每天的入库了也在10万-80万之间,导致查询经常性的超时。就会出现下面的情况: count(0)查询超时 [SQL]SELECT count(0) from tbm_news_info ; [Err] 2013 - Lost co... 阅读详情

前言

有位朋友去阿里面试,他说面试官给了几条查询SQL,问:需要执行几次树搜索操作?我朋友当时是有点懵的,后来冷静思考,才发现就是考索引的几个基础知识点~~ 本文我们分九个索引知识点,一起来探讨一下。

  • 面试官考点之索引是什么?
  • 面试官考点之索引类型
  • 面试官考点之为什么选择B+树作索引结构
  • 面试官考点之一次索引搜索过程
  • 面试官考点之覆盖索引
  • 面试官考点之索引失效场景
  • 面试官考点之最左前缀
  • 面试官考点之索引下推
  • 面试官考点之大表添加索引

一、面试官考点之索引是什么?

阿里一面,给了几条SQL,问需要执行几次树搜索操作?

  • 索引是一种能提高数据库查询效率的数据结构。它可以比作一本字典的目录,可以帮你快速找到对应的记录。
  • 索引一般存储在磁盘的文件中,它是占用物理空间的。
  • 正所谓水能载舟,也能覆舟。适当的索引能提高查询效率,过多的索引会影响数据库表的插入和更新功能。

二、索引有哪些类型类型

阿里一面,给了几条SQL,问需要执行几次树搜索操作?

数据结构维度

  • B+树索引:所有数据存储在叶子节点,复杂度为O(logn),适合范围查询。
  • 哈希索引: 适合等值查询,检索效率高,一次到位。
  • 全文索引:MyISAM和InnoDB中都支持使用全文索引,一般在文本类型char,text,varchar类型上创建。
  • R-Tree索引: 用来对GIS数据类型创建SPATIAL索引

物理存储维度

  • 聚集索引:聚集索引就是以主键创建的索引,在叶子节点存储的是表中的数据。
  • 非聚集索引:非聚集索引就是以非主键创建的索引,在叶子节点存储的是主键和索引列。

逻辑维度

  • 主键索引:一种特殊的唯一索引,不允许有空值。
  • 普通索引:MySQL中基本索引类型,允许空值和重复值。
  • 联合索引:多个字段创建的索引,使用时遵循最左前缀原则。
  • 唯一索引:索引列中的值必须是唯一的,但是允许为空值。
  • 空间索引:MySQL5.7之后支持空间索引,在空间索引这方面遵循OpenGIS几何数据模型规则。

三、面试官考点之为什么选择B+树作为索引结构

可以从这几个维度去看这个问题,查询是否够快,效率是否稳定,存储数据多少,以及查找磁盘次数等等。为什么不是哈希结构?为什么不是二叉树,为什么不是平衡二叉树,为什么不是B树,而偏偏是B+树呢?

我们写业务SQL查询时,大多数情况下,都是范围查询的,如下SQL

select * from employee where age between 18 and 28;

为什么不使用哈希结构?

我们知道哈希结构,类似k-v结构,也就是,key和value是一对一关系。它用于等值查询还可以,但是范围查询它是无能为力的哦。

为什么不使用二叉树呢?

先回忆下二叉树相关知识啦~ 所谓二叉树,特点如下:

  • 每个结点最多两个子树,分别称为左子树和右子树。
  • 左子节点的值小于当前节点的值,当前节点值小于右子节点值
  • 顶端的节点称为根节点,没有子节点的节点值称为叶子节点。

我们脑海中,很容易就浮现出这种二叉树结构图:

阿里一面,给了几条SQL,问需要执行几次树搜索操作?

但是呢,有些特殊二叉树,它可能这样的哦:

阿里一面,给了几条SQL,问需要执行几次树搜索操作?

如果二叉树特殊化为一个链表,相当于全表扫描。那么还要索引干嘛呀?因此,一般二叉树不适合作为索引结构。

为什么不使用平衡二叉树呢?

平衡二叉树特点:它也是一颗二叉查找树,任何节点的两个子树高度最大差为1。所以就不会出现特殊化一个链表的情况啦。

阿里一面,给了几条SQL,问需要执行几次树搜索操作?

但是呢:

  • 平衡二叉树插入或者更新是,需要左旋右旋维持平衡,维护代价大
  • 如果数量多的话,树的高度会很高。因为数据是存在磁盘的,以它作为索引结构,每次从磁盘读取一个节点,操作IO的次数就多啦。

为什么不使用B树呢?

数据量大的话,平衡二叉树的高度会很高,会增加IO嘛。那为什么不选择同样数据量,高度更矮的B树呢?

阿里一面,给了几条SQL,问需要执行几次树搜索操作?

B树相对于平衡二叉树,就可以存储更多的数据,高度更低。但是最后为甚选择B+树呢?因为B+树是B树的升级版:

B+树非叶子节点上是不存储数据的,仅存储键值,而B树节点中不仅存储键值,也会存储数据。innodb中页的默认大小是16KB,如果不存储数据,那么就会存储更多的键值,相应的树的阶数(节点的子节点树)就会更大,树就会更矮更胖,如此一来我们查找数据进行磁盘的IO次数有会再次减少,数据查询的效率也会更快。B+树索引的所有数据均存储在叶子节点,而且数据是按照顺序排列的,链表连着的。那么B+树使得范围查找,排序查找,分组查找以及去重查找变得异常简单。

四、面试官考点之一次B+树索引搜索过程

面试官: 假设有以下表结构,并且有这几条数据

CREATE TABLE `employee` (
  `id` int(11) NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `date` datetime DEFAULT NULL,
  `sex` int(1) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_age` (`age`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert into employee values(100,'小伦',43,'2021-01-20','0');
insert into employee values(200,'俊杰',48,'2021-01-21','0');
insert into employee values(300,'紫琪',36,'2020-01-21','1');
insert into employee values(400,'立红',32,'2020-01-21','0');
insert into employee values(500,'易迅',37,'2020-01-21','1');
insert into employee values(600,'小军',49,'2021-01-21','0');
insert into employee values(700,'小燕',28,'2021-01-21','1');

面试官: 如果执行以下的查询SQL,需要执行几次的树搜索操作?可以画下对应的索引结构图~

select * from Temployee where age=32;

解析: 其实这个,面试官就是考察候选人是否熟悉B+树索引结构图。可以像酱紫回答~

  • 先画出idx_age索引的索引结构图,大概如下:

阿里一面,给了几条SQL,问需要执行几次树搜索操作?

  • 再画出id主键索引,我们先画出聚族索引结构图,如下:

阿里一面,给了几条SQL,问需要执行几次树搜索操作?

因此,这条 SQL 查询语句执行大概流程就是酱紫:

  • 搜索idx_age索引树,将磁盘块1加载到内存,由于32<37,搜索左路分支,到磁盘寻址磁盘块2。
  • 将磁盘块2加载到内存中,在内存继续遍历,找到age=32的记录,取得id = 400.
  • 拿到id=400后,回到id主键索引树。
  • 搜索id主键索引树,将磁盘块1加载内存,在内存遍历,找到了400,但是B+树索引非叶子节点是不保存数据的。索引会继续搜索400的右分支,到磁盘寻址磁盘块3.
  • 将磁盘块3加载内存,在内存遍历,找到id=400的记录,拿到R4这一行的数据,好的,大功告成。

因此,这个SQL查询,执行了几次树的搜索操作,是不是一步了然了呀。特别的,在idx_age二级索引树找到主键id后,回到id主键索引搜索的过程,就称为回表。

什么是回表?拿到主键再回到主键索引查询的过程,就叫做回表

五、面试官考点之覆盖索引

面试官: 如果不用select *, 而是使用select id,age,以上的题目执行了几次树搜索操作呢?

解析: 这个问题,主要考察候选人的覆盖索引知识点。回到idx_age索引树,你可以发现查询选项id和age都在叶子节点上了。因此,可以直接提供查询结果啦,根本就不需要再回表了~

阿里一面,给了几条SQL,问需要执行几次树搜索操作?

覆盖索引:在查询的数据列里面,不需要回表去查,直接从索引列就能取到想要的结果。换句话说,你SQL用到的索引列数据,覆盖了查询结果的列,就算上覆盖索引了。

所以,相对于上个问题,就是省去了回表的树搜索操作。

六、面试官考点之索引失效

面试官: 如果我现在给name字段加上普通索引,然后用个like模糊搜索,那会执行多少次查询呢?SQL如下:

select * from employee where name like '%杰伦%';

解析: 这里考察的知识点就是,like是否会导致不走索引,看先该SQL的explain执行计划吧。其实like 模糊搜索,会导致不走索引的,如下:

阿里一面,给了几条SQL,问需要执行几次树搜索操作?

因此,这条SQL最后就全表扫描啦~日常开发中,这几种骚操作都可能会导致索引失效,如下:

  • 查询条件包含or,可能导致索引失效
  • 如何字段类型是字符串,where时一定用引号括起来,否则索引失效
  • like通配符可能导致索引失效。
  • 联合索引,查询时的条件列不是联合索引中的第一个列,索引失效。
  • 在索引列上使用mysql的内置函数,索引失效。
  • 对索引列运算(如,+、-、*、/),索引失效。
  • 索引字段上使用(!= 或者 < >,not in)时,可能会导致索引失效。
  • 索引字段上使用is null, is not null,可能导致索引失效。
  • 左连接查询或者右连接查询查询关联的字段编码格式不一样,可能导致索引失效。
  • mysql估计使用全表扫描要比使用索引快,则不使用索引。

七、面试官考点联合索引之最左前缀原则

面试官: 如果我现在给name,age字段加上联合索引索引,以下SQL执行多少次树搜索呢?先画下索引树?

select * from employee where name like '小%' order by age desc;

解析: 这里考察联合索引的最左前缀原则以及like是否中索引的知识点。组合索引树示意图大概如下:

阿里一面,给了几条SQL,问需要执行几次树搜索操作?

联合索引项是先按姓名name从小到大排序,如果名字name相同,则按年龄age从小到大排序。面试官要求查所有名字第一个字是“小”的人,SQL的like '小%'是可以用上idx_name_age联合索引的。

阿里一面,给了几条SQL,问需要执行几次树搜索操作?

该查询会沿着idx_name_age索引树,找到第一个字是小的索引值,因此依次找到小军、小伦、小燕、,分别拿到Id=600、100、700,然后回三次表,去找对应的记录。 这里面的最左前缀小,就是字符串索引的最左M个字符。实际上,

  • 这个最左前缀可以是联合索引的最左N个字段。比如组合索引(a,b,c)可以相当于建了(a),(a,b),(a,b,c)三个索引,大大提高了索引复用能力。
  • 最左前缀也可以是字符串索引的最左M个字符。

八、面试官考点之索引下推

面试官: 我们还是居于组合索引 idx_name_age,以下这个SQL执行几次树搜索呢?

select * from employee where name like '小%' and age=28 and sex='0';

解析: 这里考察索引下推的知识点,如果是Mysql5.6之前,在idx_name_age索引树,找出所有名字第一个字是“小”的人,拿到它们的主键id,然后回表找出数据行,再去对比年龄和性别等其他字段。如图:

阿里一面,给了几条SQL,问需要执行几次树搜索操作?

有些朋友可能觉得奇怪,(name,age)不是联合索引嘛?为什么选出包含“小”字后,不再顺便看下年龄age再回表呢,不是更高效嘛?所以呀,MySQL 5.6 就引入了索引下推优化,可以在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数。

因此,MySQL5.6版本之后,选出包含“小”字后,顺表过滤age=28,,所以就只需一次回表。

阿里一面,给了几条SQL,问需要执行几次树搜索操作?

九、 面试官考点之大表添加索引

面试官: 如果一张表数据量级是千万级别以上的,那么,给这张表添加索引,你需要怎么做呢?

解析: 我们需要知道一点,给表添加索引的时候,是会对表加锁的。如果不谨慎操作,有可能出现生产事故的。可以参考以下方法:

  • 1.先创建一张跟原表A数据结构相同的新表B。
  • 2.在新表B添加需要加上的新索引。
  • 3.把原表A数据导到新表B
  • 4.rename新表B为原表的表名A,原表A换别的表名;

总结与练习

本文主要讲解了索引的9大关键面试考点,希望对大家有帮助。接下来呢,给大家出一道,有关于我最近业务开发遇到的加索引SQL,看下大家是怎么回答的,有兴趣可以联系我,一起讨论哈~题目如下:

select * from A where type ='1' and status ='s' order by create_time desc;

假设type有9种类型,区分度还算可以,status的区分度不高(有3种类型),那么你是如何加索引呢?

  • 是给type加单索引
  • 还是(type,status,create_time)联合索引
  • 还是(type,create_time)联合索引呢?

有需要的小伙伴,点赞加收藏,关注我之后添加小助理vx:bjmsb0606006 即可获取免费下载方式

fMRI数据处理:从DICOM到NIFTI(下) 上一篇我们完成了对原始DICOM的数据整理,将其整理为了BIDS目录结构。作为从从DICOM到NIFTI的最后一篇,当然是介绍如何批量将DICOM格式转NIFTI格式啦!从DICOM到NIFTI系列就完成啦!撒花★,°.°★。从核磁机器把数据拷回来——到整理成BIDS格式——到批量转格式;我们fMRI数据处理的第一步就算是正式迈出去啦!接下来的内容,敬请期待吧~ 阅读详情

相关推荐

《Halcon 100项目-9》Halcon彩色线序检查

Halcon彩色线序检查

doubleintfloat的博客 1043

MySQL基础(四)-----简单查询和带附带条件的查询

MySQL的查询分为普通查询(简单查询)和带条件的查询、以及复杂查询,本章主要介绍一下普通查询和带条件查询。

leen的博客 1977

Linux安装MinIO(图文解说详细版)

最近开个新坑,就是在linux环境中操作开发环境,带大家玩转Linux,会整理出一篇Linux的专栏,欢迎大家订阅!! 富贵同学linux环境为CentOS7.8 版本。 上期跟大家说了一下OpenJDK的安装,这次说一下minio的安装 第一步,进入/opt 目录,创建minio文件夹 cd /opt mkdir minio 第二步,wget下载安装包: wget https://dl.minio.io/server/minio/release/linux-amd64/minio 第三步,进入m

编码人生 5万+

mysql查询全表比加上搜索条件更快_Mysql索引数据结构详解及性能调优

以前学习了不少东西,都忘了不少,最近就想着总结一下,就想到想写博客文章来总结下自己这些年学习的东西,记录下各方面技术学习情况。如果觉得好看,请给个赞你有一个思想,我有一个思想,我们交换后,一个人就有两个思想If you can NOT explain it simply, you do NOT understand it well enough简单介绍下这篇文章的流程1.为什么使用索引A:那还用说...

weixin_39963174的博客 1441

Ceph入门到精通-更换osd、扩容osd

【代码】Ceph入门到精通-更换osd、扩容osd。

隔壁老瓦的专栏 1548

[QMT和ptrade量化交易小白入门]-112、小市值热点概念交易策略,回测5年20倍

本专栏主要是介绍QMT和ptrade的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写200篇左右。QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步。

木头大左的博客 1080

mysql是用什么检索和输出_MySQL(二)数据的检索和过滤

使用频率最高的SQL语句应该就是select语句了,它的用途就是从一个或多个表中检索信息,使用select检索表数据必须给出至少两条信息:想选择什么,以及从什么地方选择一、检索数据1、检索单个列select column from table;该SQL语句的检索结果将返回表中的所有行,数据没有过滤(过滤将得出结果集的一个子集),也没有排序(如没有明确排序查询结果,则返回数据的顺序没有特殊意义,只要...

weixin_39879665的博客 585

从原理到落地:Mamba-YOLOv8 全面实战指南(源码 + 训练 + 部署一次学会)

在目标检测领域,CNN与Transformer的较量从未停歇。本文提出一种革命性的架构——,将状态空间模型(SSM)首次引入YOLO框架。实验表明,该模型在COCO数据集上达到54.3% mAP@0.5,推理速度达89 FPS(RTX 4090),相比原版YOLOv8提升12.7%精度与23%速度。本文将完整揭示其技术原理与工程实现,助您掌握这一前沿技术。

FJN110的博客 120

阿里一面,给了几条SQL,问需要执行几次树搜索操作,复盘上次Redis缓存雪崩事故

为什么我不完全主张自学?①平台上的大牛基本上都有很多年的工作经验了,你有没有想过之前行业的门槛是什么样的,现在行业门槛是什么样的?以前企业对于程序员能力要求没有这么高,甚至十多年前你只要会写个“Hello World”,你都可以入门这个行业,所以以前要入门是完全可以入门的。②现在也有一些优秀的年轻大牛,他们或许也是自学成才,但是他们一定是具备优秀的学习能力,优秀的自我管理能力(时间管理,静心坚持等方面)以及善于发现问题并总结问题。

m0_61067876的博客 1112

产品包装质检实战:基于YOLOv5的智能包装合格检测系统全流程指南

摘要: 针对产品包装质检效率低、漏检率高的问题,本文提出基于YOLOv5的智能检测系统。系统通过采集包装缺陷数据(破损、缺标、封装不良等),利用YOLOv5实现多类别缺陷识别(准确率≥95%),并开发Flask Web界面实现检测可视化与报告生成。实验表明,该系统在30帧/秒的产线速度下可稳定运行,显著提升质检效率。项目涵盖数据标注、模型训练、系统开发全流程,具有工业落地价值,适用于智能制造场景的自动化质检需求。(149字)

LXY_LOVE36的博客 93

SAP_SD模块-销售批次策略应用记录

SAP_SD模块-销售批次策略完整案例

风沙的博客 2610

备战春招:阿里一面,给了几条SQL,问需要执行几次树搜索操作?

作者 | 捡田螺的小男孩来源 | 捡田螺的小男孩有位朋友去阿里面试,他说面试官给了几条查询SQL,问:需要执行几次树搜索操作?我朋友当时是有点懵的,后来冷静思考,才发现就是考索引的几个基础...

优快云云计算 298

SystemUI-下拉去掉后去掉用户切换-去掉电源按键中的紧急呼叫

这里自己倒腾完成了两个常见需求:去除用户切换、去除紧急呼叫UI在去除用户切换时候,用到了Compose知识点,所以很难按照以前经验去找对应布局、找对应的View Item ,以往方法都只能部分借鉴的搞系统的还是要跟着谷歌学一点Compose技能了,方便日常开发调试。

十年饮冰,难凉热血 1459

最全阿里一面,给了几条SQL,问需要执行几次树搜索操作?,java高并发面试题及答案

本文主要讲解了索引的9大关键面试考点,希望对大家有帮助。接下来呢,给大家出一道,有关于我最近业务开发遇到的加索引SQL,看下大家是怎么回答的,有兴趣可以联系我,一起讨论哈~题目如下:假设type有9种类型,区分度还算可以,status的区分度不高(有3种类型),那么你是如何加索引呢?是给type加单索引还是(type,status,create_time)联合索引还是(type,create_time)联合索引呢?作者:Jay_huaxiao。

wsjh156456的博客 954

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

上一篇: 差点就与华为Offer无缘?HUAWEI 4面技术5面HR,踩线挺过
下一篇: 我能用一张思维导图,就能让你一览所有的Docker常用命令,看不懂你来打我!!!!
Fightevery
博客等级 码龄5年 19粉丝 223原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值