Java面试题总结10之MySQL索引和锁

news2024/10/6 22:25:45

索引的基本原理

把无需的数据变成有序的查询

1,把创建了索引的列的内容进行排序

2,对排序结果生成倒排表

3,到倒排表内容上拼上数据地址链

4,在查询的时候,先拿到倒排表内容,再取出数据地址链,从而拿到具体数据

mysql聚簇和非聚簇索引的区别

都是B+树的数据结构

聚簇索引:将数据存储与索引放到了一块,并且时按照一定的顺序组织的,找到索引就是找到数

据,数据的物理存放顺序与索引顺序时一致的,即:索引是相邻的,那么对应的数据一定的也是相

邻地放在磁盘上的

非聚簇索引:叶子节点不存储数据,存储的是数据行地址,也就是说根据索引查找到数据行的位置

再取磁盘查找数据,类似一本书的目录,比如要查找第一章第一节,那么我们先在这个目录里面

找,找到对于的页码再去对应的页码查看文章

InnoDB中一定有主键,主键一定是聚簇索引,不手动设置则会使用unique索引,没有unique索

引,则会使用数据库内部的一个行的隐藏id来当作主键索引,在聚簇索引之上创建的索引称之为辅

助索引,辅助索引访问数据总是需要二次查找,非聚簇索引都是辅助索引,像复合索引,前缀索

引,唯一索引,辅助索引叶子节点存储的不再是行的物理位置,而是主键值

MyISAM使用的是非聚簇索引,没有聚簇索引,非聚簇索引的两颗B+树看上去没什么不同,节点的

结构完全一致,只是存储的内容不同,主键索引B+树的节点存储了主键,辅助索引B+树存储了辅

助建,表数据存储在独立的地方,这两颗B+树的叶子节点都是用一个地址只想真正的表数据,对

于表数据来说,这两个键没有任何区别,由于索引树是独立的,通过辅助键检索无需访问主键的索引树。

但是涉及到大数据量的排序,全表扫描,count之类的操作,还是MyISAM占优,因为索引所占空

间小,因为这些操作是需要在内存中完成的。

MySQL索引的数据结构,各自的优劣

简介:

索引的数据结构和具体存储引擎的实现有关,在MySQL中使用较多的索引为Hash索引,B+树索引等,InnoDB存储引擎的默认实现为B+树索引,对于哈希索引来说,底层的数据结构就是哈希表,因此在绝大部分需求为单挑记录查询的时候,可以选择哈希索引,查询性能最快,其余大部分场景,建议选择BTree索引

B+树:

B+树是一个平衡的多叉树,从根节点到每个叶子节点的高度差值不超过一,而且同层级的节点间有指针相互链接,在B+ 树上的常规检索,从根节点到叶子节点的搜索效率基本相当,不会出现大幅波动,而且基于索引的顺序扫描时,也可以利用双向指针快速左右移动了,效率非常高,B+树索引也被广泛应用于数据库,文件系统

哈希索引:

采取一定的哈希算法,把键值换算成新的哈希值,检索式不需要类似B+树从根节点到叶子节点

逐级查找,只需要一次哈希算法就可立刻定位到相应的位置,速度很快,在等值查询上,哈希索引

有绝对优势,经过一次算法就能找到对应的键值,前提键值唯一,不唯一就得查找键所在地址,然后根据链表往后扫描,直到找到对应的数据,

不支持范围查询搜索,因为有序的键值经过哈希之后,就会变得不连续,不能再利用索引进行范围查询检索,

也没办法利用索引完成排序,以及部分模糊查询(like 'xxx%')

不支持多列联合索引的最左匹配机制

大量重复键值情况下,哈希效率极低,会存在哈希碰撞

索引设计的原则

查询更快,占用空间更小,等主体业务功能开发完毕,把涉及到该表相关sql都要拿出来分析之后再建立索引。

1、联合索引尽量覆盖条件

比如可以设计一个或者两三个联合索引(尽量少建单值索引),让每一个联合索引都尽量去包含sql语句里的

where、order by、group by的字段,还要确保这些联合索引的字段顺序尽量满足sql查询的最左前缀原则。

2、不要在小基数字段上建立索引

索引基数是指这个字段在表里总共有多少个不同的值,比如

一张表总共100万行记录,其中有个性别字段,

其值不是男就是女,那么该字段的基数就是2。

 

3、长字符串我们可以采用前缀索引

尽量对字段类型较小的列设计索引,比如说什么tiny int之类的。

4、where与order by冲突时优先where

5、基于慢sql查询做优化

6、更新频繁的不适合做索引

7、定义有外键的数据列一定建立索引

MySQL锁的分类

基于锁的属性分类:共享锁,排他锁

基于锁的粒度分类:行级锁,表级锁,页级锁,记录锁,间隙锁,临键锁

基于锁的状态分类:意向共享锁,意向排它锁

共享锁(Share Lock)

又称读锁,S锁,一个事务为数据加上读锁之后,其他事务之对该数据加读锁,不能加写锁直到所

有读锁释放才能进行加持写锁,它的特性就是为了支持并发的读取数据,读取数据的时候不支持修改,避免重复读

排他锁(ExClusive Lock)

又称写锁,X锁,一个事务为数据加上写锁时,其他请求就不能为数据加任何锁,直到该锁释放之

后,其他事务才能对数据加锁,它的目的就是在数据修改时其他人不能同时修改,也不能读取,避免脏数据和脏读的问题

表锁(Table Lock)

指上锁的时候锁住的是整个表,当下一个事务访问该表的时候,必须等前一个事务释放了锁才能进行对表访问,特点:力度大,加锁简单,容易冲突

行锁()

指上锁的时候锁住的是表的某一行数据或多行记录,其他事务访问同一张表的时,只有被锁住的记录不能访问,其他记录可正常访问。

特点:粒度小,加锁比表锁麻烦,不容易冲突,相比表锁支持的并发要高、

记录锁(Record Lock)

属于行锁的一种,记录锁的范围只是表的某一条记录,事务在枷锁后所住的只是表的某一条记录

避免数据在被查询时被修改的重复读问题和在修改的事务未提交钱被其他事务读取的脏读问题

页锁

MySQL中锁定颗粒介于行级锁和表级锁中间的锁,取了折中的页级,一次锁定相邻的一组记录

特点,开锁和加锁时间介于表锁和行锁之间,会出现死锁,并发度一般

间隙锁(Gap Lock)

行锁的一种,在事务枷锁后锁住的时表记录的某一个区间,当表的相邻id之间出现空隙则会形成一

个区间,遵循左开右闭原则,只会出现在REPEATABLE READ(重复读)的事务级别中,没有间隙锁则会出现同一事务,两次查询结构不同

临建锁(Next-Key Locks)

锁住某条记录 ,又想阻止其他事务在该记录前边的间隙插入新记录 ,Next-Key Locks是在存储引

擎innodb 、事务级别在可重复读的情况下使用的数据库锁,避免在范围查询时出现脏读,重复读,

幻读问题,加锁后,范围区间内数据不允许被修改和插入

意向共享锁

事务试图对整个表进行加共享锁之前,首先要获得这个表的意向共享锁

意向排他锁

事务试图对整个表进行加排他锁之前,首先要获得这个表的意向排他锁

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

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

相关文章

【HarmonyOS】ArkTS-函数

目录 函数-Function函数基本使用函数的参数箭头函数 函数-Function 函数:是可以被重复使用的代码块 作用:函数可以把具有相同或相似逻辑的代码“包裹”起来,有利于代码复用。 函数基本使用 定义函数 function 函数名() { 函数体 }调用函数 …

白酒:蒸馏技术的优化与新型蒸馏设备的研发

蒸馏技术是豪迈白酒生产中的重要环节,直接关系到产品的质量和风格。云仓酒庄在蒸馏技术的优化和新型蒸馏设备的研发方面进行了大量探索和实践,旨在提升白酒的品质和口感。 首先,蒸馏技术的优化对于豪迈白酒的品质至关重要。传统的蒸馏技术通常…

0环PEB断链

在操作系统层面上,进程本质上就是一个结构体,当操作系统想要创建一个进程时,就分配一块内存,填入一个结构体,并为结构体中的每一项填充一些具体值。而这个结构体,就是EPROCESS 在0x088 偏移处有一个指针Act…

关于JVM的小总结(待补充)

JVM组成及他们之间的关系 装载类子系统字节码执行引擎运行时数据区 装载类子系统 类加载器字节码调节器类加载运行时数据区 字节码执行引擎 运行时数据区 线程私有 虚拟机栈本地方法栈程序计数器 线程共享 堆方法区(元空间)

基于Vue的分类招生App设计与实现

目 录 摘 要 I Abstract II 引 言 1 1 绪论 3 1.1 项目的研究背景与意义 3 1.1 研究背景 31.2 研究意义 3 1.2 研究现状 4 1.3 技术简介 43.1 前端开发技术 43.2 服务端开发技术 53.3 数据库 6 1.4 本章小结 6 2 项目…

MercadoLibre(美客多)运营策略:补单操作的重要性与条件要求

在美客多平台上,许多商家普遍认为,店铺的重要性远超产品本身,同时竞争环境也显得相对宽松。因此,他们倾向于认为在美客多进行补单操作并非必要之举。然而,深入剖析美客多平台的运营规则后,我们不难发现补单…

基于springboot的大学生智能消费记账系统的设计与实现(程序+数据库+文档)

** 🍅点赞收藏关注 → 私信领取本源代码、数据库🍅 本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目,希望你能有所收获,少走一些弯路。🍅关注我不迷路🍅** 一、研究背景…

nestjs10.x使用jwt生成token

1 安装依赖: pnpm install --save nestjs/jwtpnpm install passport passport-jwt nestjs/jwtpnpm install types/passport-jwt --save-dev 2 可以使用命令新建auth鉴权文件夹 nest g mo auth // auth.module.ts nest g s auth // auth.service.ts nest g co …

记录 | mac报错:not prividing “FindClang.cmake“

报错: CMake Error at CMakeLists.txt:72 (find_package): By not providing "FindClang.cmake" in CMAKE_MODULE_PATH this project has asked CMake to find a package configuration file provided by "Clang", but CMake did not find one.…

香橙派AIpro外设接口样例大全(附源码)

Orange Pi AI Pro 开发板是香橙派联合华为精心打造的高性能 AI 开发板,其搭载了昇腾 AI 处理器,可提供 8TOPS INT8 的计算能力,内存提供了 8GB 和 16GB两种版本。可以实现图像、视频等多种数据分析与推理计算,可广泛用于教育、机器…

视频水印怎么轻松去除?这三款神器让您直呼过瘾!

在现代社会,视频内容日益丰富多样,但有时我们更希望获得视频中的文字文稿,以便于搜索、编辑或传播。下面我将为您介绍三款优秀的视频转文字工具,它们能够帮助您快速、准确地将视频内容转换为可编辑的文字格式。让我们一起来看看这…

【开源】SpringBoot框架开发快乐贩卖馆管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 搞笑视频模块2.3 视频收藏模块2.4 视频评分模块2.5 视频交易模块2.6 视频好友模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 搞笑视频表3.2.2 视频收藏表3.2.3 视频评分表3.2.4 视频交易表 四、系…

广播

1.什么是广播 2.标准广播 BroadStandardActivity.java package com.tiger.chapter09;import androidx.appcompat.app.AppCompatActivity;import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.view.View;…

Vue 使用@别名

1. 安装 types/node types/node 包允许您在TypeScript项目中使用Node.js的核心模块和API,并提供了对它们的类型检查和智能提示的支持。 npm install types/node --save-dev 比如安装之后,就可以导入nodejs的 path模块,在下面代码 import pat…

数据要素“摸家底”:是什么?为什么?怎么做?

继经济数据“摸家底”之后,全国数据资源也迎来一次“大摸底”。2月19日,国家数据局等四部门发布《关于开展全国数据资源调查的通知》,提出“摸清数据资源底数”,为相关政策制定、试点示范等工作提供数据支持。如此大规模数据资源调…

centos7保姆级安装jdk8教程

文章目录 1、下载jdk安装包2、在centos7 创建文件夹3、解压jdk文件4、配置环境变量a、打开环境变量文件b、将配置信息复制进去。c、重新加载环境变量 5、测试是否成功 1、下载jdk安装包 jdk下载地址:https://www.oracle.com/java/technologies/downloads/ Oracle…

深入了解Python的eval函数:基础用法与潜在危险【第118篇—eval函数】

深入了解Python的eval函数:基础用法与潜在危险 在Python中,eval函数是一个强大而灵活的工具,它允许将字符串作为代码来执行。然而,虽然eval在某些情况下非常方便,但它也潜藏着一些潜在的危险,如果不小心使…

MySQL 学习笔记(基础篇 Day3)

「写在前面」 本文为黑马程序员 MySQL 教程的学习笔记。本着自己学习、分享他人的态度,分享学习笔记,希望能对大家有所帮助。推荐先按顺序阅读往期内容: 1. MySQL 学习笔记(基础篇 Day1) 2. MySQL 学习笔记&#xff08…

【论文阅读笔记】Activating More Pixels in Image Super-Resolution Transformer

论文地址:https://arxiv.org/abs/2205.04437 代码位置:https://github.com/XPixelGroup/HAT 论文小结 本文方法是基于Transformer的方法,探索了Transformer在低级视觉任务(如SR)中的应用潜力。本文提升有效利用像素范…

机器学习的魔法(一)从零开始理解吴恩达的精炼笔记

一、机器学习是什么? 1、机器学习的概念 机器学习是一种人工智能领域的技术和方法,旨在使计算机系统能够从经验数据中自动学习和改进,而无需显式地进行编程。它涉及开发算法和模型,使计算机能够自动分析和理解数据,并…