java面试题-mysql索引相关问题

远离八股文,面试大白话,通俗且易懂

看完后试着用自己的话复述出来。有问题请指出,有需要帮助理解的或者遇到的真实面试题不知道怎么总结的也请评论中写出来,大家一起解决。

java面试题汇总-目录-持续更新中

这一块本想着晚一点再整理,因为我怕我自己也讲不明白,但是最近确实很多人说自己面试遇到了,很难讲清楚,所以还是整理了一下,感觉能很顺畅的读懂后决定发出来给大家看一下。

这一章决定讲的详细一点。所以大家最好仔细读一下

1.索引介绍

首先,从navicat创建索引的界面中 可以看到,索引的组成就是

索引名称、对应的字段、索引类型、索引方法、注释

众所周知,索引会使得查询速度变快,所以引出第一个问题

索引为什么会这么快?

答:首先,mysql在查询一张表的时候,如果这张表没有索引,那么查询语句需要在磁盘上将该表的数据一条一条的扫描,然后每一列都需要进行判断后选取符合条件的结果集进行返回。

但是加了索引之后,就相当于给mysql表添加了一个目录一样,如果此时你的查询条件中刚好有索引字段,那么mysql在查询的时候就会先去查询这个索引目录,然后在符合条件的结果集中再去对其他条件进行筛选。这样就会使得扫描的数据大幅度减少,从而提高效率。

同时呢,索引还具有有序性,简言之就是像新华字典一样,相同类型的数据存储在一起,这样就会使得排序、分组等等聚合操作变得更加快。

2.索引类型

针对mysql索引类型,我这边只谈一些常用的,因为工作这么久一些索引类型虽然有所耳闻但是基本没有使用过,所以在平时的工作或者面试中完全足够应付。

 1.按照字段特性划分

(主键索引、唯一索引、全文索引、普通索引)

1.主键索引:这个大家最熟悉,就是mysql表的主键,一张表只有一个,但是不能为空,不能重复

2.唯一索引:针对某一字段创建,保证数据的唯一性,但是可以为空

3.全文索引:这个大家知道就行,全文索引主要是用来进行文章等分词检索的,比如这个字段中存了一篇长文,你要查询是否包含某个单词,就可以使用这个索引。他会根据配置将这个整篇文章分成比如两个字或者三个字的或者其他字数的单词跟你的关键字进行匹配。但是因为现在ES索引数据库做的比较好,所以这个用处不大。

4.普通索引:就是我们常用的索引,可以为空,可以重复

2.按照物理存储划分

(聚簇索引、非聚簇索引)

这个也是经常被问到,因为涉及到存储方式B+树,后面描述,这里用大白话描述一下。

1.聚簇索引:其实也就是主键索引,一张表中只有一个,因为我们知道创建索引就是在磁盘中开辟空间存储索引信息。聚簇索引是将索引和数据放在一起了,就相当于我们找到了这个索引,就找到了这个索引对应的数据行。所以,数据库中主键查询一般都很快。

2.非聚簇索引:我们创建的普通索引都属于非聚簇索引,一张表中可以创建多个,通过名字也能看出。就是索引的位置和数据的位置是分开存储的,我们通过查询索引的位置,确定索引后还需要根据索引再去另一片空间上去查找索引对应的数据。

(通俗来讲:就是我们查字典的时候,首先翻目录,结果我们在目录中很快的找到了一个字,突然发现这个字的后就是对应的解释,这就叫做聚簇索引。而如果我们查字典,在目录中找到一个字,但是后面什么都没有只有对应的页码,我们还需要根据页码再去找对应的解释,这个叫做非聚簇索引)

3.按照字段个数划分

(单列索引、组合索引)

1.单列索引:如果这个索引对应的列只有一个,那就是单列索引

2.组合索引:显而易见,一个索引名称对应多个字段。使用场景就是比如你一个查询业务中,如果两个条件或是三个条件每次都是搭配使用(固定搭配)这样就可以建立一个组合索引,而不需要建立三个单独的,可以一定程度上减少磁盘存储空间(一个索引和三个索引占用的空间还是不同的)

需要注意的是:组合索引必须坚持最左原则

比如:你的索引是name+age+sex;如果你的查询条件中没有name,那么索引就会失效。很重要!!!!!

3.索引方法

可以看到主要就是B+TREE索引和HASH索引

但是项目中我猜测大家基本见过的都是BTREE索引,下面看下具体原因

1.Hash索引。首先hash我们很容易联想到java中的hashmap,根据这一特点我们可以总结出来hash索引的一个特点:

hash索引也是根据hashcode进行存储,数据是无序的,所以你就没有办法进行范围搜索。同时排序也成了一个大的难题。这就导致hash索引使用场景并不多。但是既然存在就肯定有用处,hash的特性也就造成了hash索引对于等值查询的效率非常高,如果你的查询条件中是=、in、!=的时候,这个场景才是hash索引的价值所在。

2.B+tree

这个描述大家看一下是否能看懂,我能理解但是可能不能很好的表达。建议多查一查B+TREE原理

首先需要了解二叉树,二叉树的查询很方便,但是对于数据量大的情况下,你的二叉树也相应的会变大,所以只采用了二叉树的理念。

上图就是一个二叉树,他的规律就是每个节点连线的左侧肯定比自己小:比如2<3,3<5,3<6,6<7..

右侧肯定比左侧大:8>7、5>3  ...这样就比较方便进行二分查找或者范围查找,如果条件得当直接省略一半的查询时间。

 

但是二叉树只在节点上存一个关键字。所以效率相对并不高。

于是B+TREE就引入了每个节点可以存储多个数据。也就是刚开始就一个节点,不断的往里存数据,如果达到一定数量就开始分裂,同时遵循二叉树原则,是有序的。图中的圆圈都代表索引节点,他们每一个都对应着叶子节点。所有的叶子节点是根据顺序相连接的形成一个链表,这样就方便进行范围查询。

比如:我要查询40-70的数据,则直接通过下图的两个节点就可以直接确认。

4.索引失效的场景

  1. 使用or 关键字 即使左侧是索引  但是右侧不是索引则会失效
  2. where 中以% 开头的
  3. 索引字段变成表达式的时候  id+1 = 2  应该是id = 3
  4. 组合索引违背最左原则当查询条件中没有第一个组合索引的字段(name)会导致索引失效

以上:根据自己的话做下总结,能讲出这些来足够应付大部分mysql索引面试了,但是如果更为详细的DB面试可能还不够,还需在深耕。

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

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

相关文章

大型软件编程实际应用实例:个体诊所电子处方系统,使用配方模板功能输入症状就可开出处方软件操作教程

一、前言&#xff1a; 在开电子处方的时候&#xff0c;如果能够输入症状就可以一键导入配方&#xff0c;则在很大程度上可以节省很多时间。而且这个配方可以根据自己的经验自己设置&#xff0c;下面以 佳易王诊所电子处方软件为例说明。 二、具体一键导入配方详细操作教程 点击…

Linux本地部署Mosquitto MQTT协议消息服务端并实现远程访问【内网穿透】

文章目录 前言1. Linux 搭建 Mosquitto2. Linux 安装Cpolar3. 创建MQTT服务公网连接地址4. 客户端远程连接MQTT服务5. 代码调用MQTT服务6. 固定连接TCP公网地址7. 固定地址连接测试 前言 Mosquitto是一个开源的消息代理&#xff0c;它实现了MQTT协议版本3.1和3.1.1。它可以在不…

牛客周赛 Round 22(C、D题解)

C、小红的数组构造&#xff08;思维&#xff09; 一、题目要求 链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述 小红想让你构造一个长度为 n 的数组&#xff0c;满足以下三个条件&#xff1a; 1. 该数组最大值不超过 k。 2. 该数…

adb命令学习记录

1、 adb ( android debug bridge)安卓调试桥&#xff0c;用于完成电脑和手机之间的通信控制。 xcode来完成对于ios设备的操控&#xff0c;前提是有个mac电脑。 安卓系统是基于linux内核来进行开发的。 2、adb的安装: 本身 adb是 android SDK 其中自带的工具&#xff0c;用于完…

项目必备手册-项目计划书

项目开发计划包括项目描述、项目组织、成本预算、人力资源估算、设备资源计划、沟通计划、采购计划、风险计划、项目过程定义及项目的进度安排和里程碑、质量计划、数据管理计划、度量和分析计划、监控计划和培训计划等。 软件全资料获取&#xff1a;点我获取

充分发挥SQL能力之数列

SQL数列 1、数列概述2、SQL数列2.1、简单递增序列2.2、等差数列2.3、等比数列3、SQL数列的应用3.1、连续问题3.2、多维分析1、数列概述 数列是最常见的数据形式之一,实际数据开发场景中遇到的基本都是有限数列。常见的数列例如:简单递增序列、等差数列、等比数列等 如何充分…

(新手必看)自定义数据传输通信协议+STM32代码详解

前言 本篇博客主要学习和了解一些单片机协议的格式&#xff0c;在对传输大数据或者要求准确性的时候&#xff0c;都需要通过协议来发送接收&#xff0c;下面通过了解协议的基本构成和代码来分析和实现协议的发送和接收。本篇博客大部分是自己收集和整理&#xff0c;如有侵权请联…

yolov8 onnx推理

前言&#xff1a;yolov8的后处理在某些情况下会导致转模型失败&#xff0c;因此需要把后处理剥离出来。 代码需要做如下修改&#xff1a; 改完后&#xff0c;网络会有三个输出&#xff0c;如图&#xff1a; 最后&#xff0c;用python写网络的后处理&#xff1a; import onn…

用心研发好产品:健康品牌podeey是如何做到的?

在分析消费者健康需求的同时&#xff0c;美国podeey能量生命有限公司&#xff08;PODEEY Biotechnology LLC.&#xff09;不断提升自主研发实力&#xff0c;并且一直注重汇集全球前沿的研发力量&#xff0c;与贵州宏臻菌业达成战略合作&#xff0c;始终致力于以科学技术为核心&…

软件测试HR总结的软件测试常见面试题

一、测试流程是什么样的&#xff1f; 1.产品确定需求后&#xff0c;邀请项目经理&#xff0c;开发&#xff0c;测试等人员参加需求评审会&#xff1b; 2.评审结束后开发根据需求文档和接口文档开发&#xff0c;测试制定测试计划和编写手工测试用例&#xff0c;测试脑图&#xf…

【Redis】深入理解 Redis 常用数据类型源码及底层实现(1.结构与源码概述)

在文章【Redis】不卡壳的 Redis 学习之路&#xff1a;从十大数据类型开始入手中我们介绍了Redis常用的10大数据类型&#xff0c;这10大数据类型可并不是直接在底层通过代码实现的&#xff0c;而是通过不同的底层数据结构组合起来的&#xff0c;这篇我们介绍下Redis常用数据类型…

【LeetCode】每日一题 2023_12_12 下一个更大元素 IV(堆,优先级队列/单调栈)

文章目录 刷题前唠嗑题目&#xff1a;下一个更大元素 IV题目描述代码与解题思路 刷题前唠嗑 LeetCode&#xff1f;启动&#xff01;&#xff01;&#xff01; 时隔两天&#xff0c;LeetCode 每日一题重新开张&#xff0c;流感已经不能阻挡我的脚步了&#xff01; 题目&#x…

乐小鱼大理之行

在一个晴朗的日子里&#xff0c;乐小鱼和她的家人一起踏上了一场梦幻般的大理之行。他们驱车穿越沧山&#xff0c;眼前豁然开朗&#xff0c;洱海在阳光下泛着碧绿的光芒。 乐小鱼好奇地探出头&#xff0c;看到了连绵的山脉和湛蓝的湖水。她兴奋地说&#xff1a;“哇&#xff0…

【C++】类与对象(下)

本文目录 1. 再谈构造函数1.1 构造函数体赋值1.2 初始化列表1.3 explicit关键字 2. static成员2.1 概念2.2 特性 3. 友元3.1 友元函数3.2 友元类 4. 内部类5. 匿名对象6. 拷贝对象时的一些编译器优化7. 再次理解类和对象 1. 再谈构造函数 1.1 构造函数体赋值 在创建对象时&am…

C++中的reverse函数

1.实现反转数组。 //头文件 #include <algorithm> //使用方法 reverse(a, an);//n为数组中的元素个数 #include<cstdio> #include<iostream> #include<algorithm> using namespace std; int main() {int a[100];int n,k;cin >> n >> k; …

QT 入门

目录 QT 概述 QT5安装 QT环境介绍 编写第一个QT的程序 QT项目文件介绍 QT 概述 QT简介 QT是一个跨平台的C图形用户界面应用程序框架。它为程序开发者提供图形界面所需的所有功能。它是完全面向对象的&#xff0c;很容易扩展&#xff0c;并且允许真正地组件编程。 QT的发…

欣赏动态之美,不如欣赏C语言实现动态内存管理之美 ! ! !

本篇会加入个人的所谓‘鱼式疯言’ ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 我会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. 可能说的不是那么严谨.但小编初心是能让更多人能接受我们这个概念 &#xff01;&#xff0…

【WinRAR】为什么右键没有压缩选项?

我们安装了WinRAR之后想要压缩文件&#xff0c;但是右键点击文件之后发现并没有WinRAR压缩选项&#xff0c;这应该如何设置才能出现右键带有压缩选项呢&#xff1f;方法如下&#xff1a; 首先打开WinRAR&#xff0c;在上面功能中点击选项 – 设置 然后我们在设置界面中切换到集…

数据结构:栈(Stack)的各种操作(入栈,出栈,判断栈非空,判断栈已满,附源码)

前言&#xff1a;在前面的文章中&#xff0c;我们讲解了顺序表&#xff0c;单链表&#xff0c;双向链表。而我们今天要分享的栈则是基于之前的数据结构上搭建的&#xff0c;但是相较于顺序表和链表来说&#xff0c;栈的实现就非常简单了。 目录 一.栈(Stack)的概念 二.栈的数…

html创建电子邮件链接

refer: 可以在a标签里使用&#xff1a; <a href"mailto:nameemail.com">Email</a>