当前位置: 首页 > news >正文

mysql的基础面经-索引、事务

1 聚簇索引

1 和主键索引的关系
2 和非聚簇索引的关系,其叶子节点存储的是聚簇索引中的主键
3 索引覆盖机制使得非聚簇索引不用回表二次查询

2 举一个使用索引覆盖的例子

我的项目中没有使用到覆盖索引,但是可以举一个例子,比如我直接为年龄建立覆盖索引,现在我查询年龄为21的人,查到了叶子节点后,就可以直接取到这些记录,而不是像非覆盖索引时查找到主键,再去聚簇索引中取得数据

3 范围查询是怎么实现的

B+树的所有叶子节点都是双向链表连接起来的,查找到左边第一个叶子节点,然后依次向右查询直至范围右端点就行。因为链表链接起来的本身是有序的

4 索引失效

4.1 索引失效的情况

1 组合索引使用不当会导致索引失效
2 使用 !=这种情况会失效

真实情况:

  • 数据库索引可以提高查询效率,但在一些情况下,索引可能会失效,也就是无法使用。以下是一些常见的索引失效的情况:
  • 使用了不等于(<>)、NOT、IS NULL、<、>、!= 操作符的查询语句,数据库无法使用索引进行优化。
  • 对于组合索引,如果查询条件不包含索引的最左侧部分,索引可能无法使用。比如有一个包含(a,b,c)的组合索引,查询条件只有b或者c的话,索引就不能被利用。
  • 在列上使用函数或者表达式时,索引无法使用。例如,
    SELECT * FROM table WHERE YEAR(column) = 2023;这样的查询无法使用索引。
  • 当使用 LIKE 操作符进行模糊查询时,如果通配符在前面,例如 LIKE ‘%xx’,那么索引无法使用。如果通配符在后面,例如 LIKE ‘xx%’,那么索引仍然可以使用。
  • 当OR操作符连接的条件分别在不同的索引列时,索引无法使用。
  • 如果数据类型不一致,比如将字符串类型的列与数字类型进行比较,这样的查询也无法使用索引。
  • 如果MySQL估计全表扫描比使用索引更快时(比如在非常小的表中),MySQL也不会使用索引。

4.2 分别讲讲各个失效的点的原因

因为查询的条件是不在索引树的节点中,无法匹配,也就查找不到具体的主键或者记录,自然就失效了

  1. 使用了不等于(<>)、NOT、IS NULL、<、>、!= 操作符的查询语句,数据库无法使用索引进行优化。

    数据库索引,比如常见的B树索引,是基于值的有序排列的,当你使用等于(=)或者在(IN)操作符时,数据库能通过索引直接找到对应的值。但如果你使用了不等于或者NOT等操作符,数据库需要检查索引中的每一个项来确定哪些值不满足条件,性能上等同于全表扫描,这就失去了使用索引的意义。至于 “<” 或 “>” 操作符,如果它们作用在范围较大时,索引优化的效果也会大大降低。

  2. 对于组合索引,如果查询条件不包含索引的最左侧部分,索引可能无法使用。

    对于组合索引,比如 (a, b, c),数据库在建立索引时,会首先对a进行排序,然后在a的值相同的情况下对b进行排序,以此类推。如果查询条件不包含索引的最左侧部分,数据库就无法有效地利用索引进行查找。

  3. 在列上使用函数或者表达式时,索引无法使用。

    如果你在查询条件中对一个列应用了函数或者表达式,数据库就无法直接使用索引找到对应的值,而需要对每一个值应用同样的函数或者表达式然后利用表达式的返回值再进行比较,因为返回值大多不是主键或者索引字段,比如count(),sum()函数,这就无法利用索引的优势了。

  4. 当使用 LIKE 操作符进行模糊查询时,如果通配符在前面,例如 LIKE ‘%xx’,那么索引无法使用。

    基于B树的索引是按照列的值的顺序建立的,当你使用LIKE 'xx%'这样的查询时,数据库可以直接定位到以’xx’开头的部分,然后返回所有符合条件的值。但如果通配符在前面,数据库则需要检查所有的值来找出符合条件的部分,这样索引就无法发挥作用了,这跟使用<>字段导致索引失效的原因是一样的

  5. 当OR操作符连接的条件分别在不同的索引列时,索引无法使用。

    这是因为,当OR操作符连接的条件分别在不同的索引列时,数据库无法同时在两个索引列上进行查找,这样就无法利用索引了。

  6. 如果数据类型不一致,比如将字符串类型的列与数字类型进行比较,这样的查询也无法使用索引。

    数据库在建立索引时会按照列的数据类型来排序,如果查询条件中的数据类型与列的数据类型不匹配,那么数据库就无法正确地使用索引了。

  7. 如果MySQL估计全表扫描比使用索引更快时(比如在非常小的表中),MySQL也不会使用索引。

    对于非常小的表,全表扫描的代价可能比通过索引查找的代价更低。在这种情况下,数据库可能会选择全表扫描而不是使用索引。这是因为索引虽然能提高查找速度,但它也需要额外的存储空间,并且在插入和删除时需要额外的时间来更新索引。因此,如果表的大小很小,使用索引的代价可能会大于它的收益。

5 讲讲索引下推

索引下推(Index Condition Pushdown,ICP)是MySQL 5.6版本以后引入的一种优化策略,用于提高带有复杂WHERE子句的查询性能。

在没有ICP的情况下,MySQL服务器会从存储引擎检索完整的行数据,然后在服务器层面对WHERE子句中的条件进行评估。这意味着存储引擎可能会检索出大量最终不满足查询条件的行。
然而,当开启ICP特性后,一部分的WHERE子句条件会被"下推"到存储引擎层面。在存储引擎进行索引查找的时候,就可以及早地过滤掉不满足这些条件的索引项,避免了无用的行数据检索。这对于某些查询可以带来明显的性能提升。

注意,不是所有的查询都可以从ICP中受益。MySQL优化器会根据查询的具体情况决定是否使用ICP。而且,目前ICP特性只有在InnoDB和MyISAM存储引擎中被支持。

6 事务

6.1 说一下事务的ACID和隔离级别

1 讲解了AID三个特性都是为了C(一致性)服务的。一般数据库需要使用事务保证数据库的一致性。
正确情况下最好详细讲讲:
ACID是用来描述数据库事务的四个关键特性的首字母缩写,具体包括:

  • 原子性(Atomicity):一个事务(transaction)必须被视为一个不可分割的最小工作单元,整个事务的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不能只执行其中的一部分操作。
  • 一致性(Consistency):事务应确保数据库从一个一致的状态转变为另一个一致的状态。一致性是指数据库应满足预定的约束条件,如数据的完整性约束等。
  • 隔离性(Isolation):多个并发事务之间需要隔离,以防止数据损坏。隔离性保证了一个事务在执行过程中,其操作和产生的中间态对其他并发事务是隔离的,即一个事务的执行不应影响其他事务。
  • 持久性(Durability):一旦事务提交,对数据的修改就是永久性的。即使出现系统故障,修改的数据也不会丢失。
    这四个特性是数据库事务所必需的,可以确保数据的一致性和可靠性。A、I、D三个特性可以看作是为了实现C(一致性)服务的。事务就是为了保证操作数据库的完整性和一致性,这就是ACID的重要性。

2 在SQL标准中定义了四种隔离级别,分别是:.。。。

6.2 假设第一个线程开启了一个事务在开始和快结束时分别读取一次,但是中间第二个线程修改了其中的数据,这个时候 第一个线程第二次读取到的数据是线程二修改后的还是修改前的数据?(重要)

答:这个问题的答案取决于你的数据库事务的隔离级别。

如果线程二的事务没有提交:在读未提交的隔离级别时,可以读取到数据,但是在读已提交、RR的级别下都不能读取到线程二修改后的数据,都只能读取到修改前的数据。

如果线程二的事务提交了:此时不存在读未提交的数据问题,但是在读已提交的隔离级别时,可以读取到修改后的数据,但是在RR级别下读取的是修改前的数据

Serializable级别下,所有事务串行化执行,如果第一个线程的事务先执行,则全程只能读取到修改前的数据,等它执行完了,线程二才能继续执行后续的修改操作。

也可以结合下面这个总结看一下:

  • Read Uncommitted(未提交读):在这个级别,一个事务可能会看到其他事务未提交的数据。所以在你的例子中,线程一第二次读取到的数据将是线程二修改后的数据。
  • Read Committed(提交读):在这个级别,一个事务只能看到其他事务已经提交的数据。在你的例子中,如果线程二在线程一第二次读取之前已经提交了事务,那么线程一会读取到线程二修改后的数据。如果线程二还没有提交,那么线程一将读取到线程二修改前的数据。
  • Repeatable Read(可重复读):在这个级别,一个事务在整个过程中看到的数据是一致的。也就是说,在事务开始后,不会再看到其他事务对数据的修改。在你的例子中,线程一第二次读取到的数据将是线程二修改前的数据,不论线程二是否已经提交了事务。
  • Serializable(可串行化):这是最严格的隔离级别,要求所有事务串行执行。这种级别可以防止所有的并发问题。

需要注意的是,隔离级别越高,数据的一致性越好,但是并发性能可能会降低。所以在实际的系统中需要根据实际的需求和性能要求来选择合适的隔离级别。

6.3 mvcc的快照如何实现的

使用undo log日志,最近一个日志也就是快照,会被数据行的一个隐藏指针db_roll_ptr指向

6.4 写sql

有一个teacher表,字段是id和name,还有一个t_s表,表示teacher-student,有字段tid,sid。现在让你查询学生数大于10个的老师。

select t.name from teacher t left join t_s ts on t.id=ts.id group by t.id having count(ts.sid)>10

6.5 数据库的隔离级别都是针对读操作的吗?

数据库的隔离级别针对的不仅仅是读操作,也包括写操作。但往往我们更关注读操作的一致性,因为在并发环境下,不同的隔离级别会对读操作产生不同的影响,比如脏读、不可重复读和幻读等问题。而写操作通常是由数据库的并发控制机制(如锁)来保证一致性的。

6.6 事务本身不能保证对写的保护,需要配合锁一起完成

你是对的。事务只是提供了一种机制,确保由一组数据库操作构成的逻辑工作单元要么完全完成,要么完全不完成(这就是事务的原子性)。但事务本身并不能防止多个事务并发地修改同一份数据,这可能会导致数据的不一致。

为了解决这个问题,数据库系统通常会使用锁等并发控制机制来防止并发事务之间的冲突。当一个事务试图修改一份数据时,数据库系统会给这份数据加锁,防止其他事务同时修改这份数据。直到这个事务完成(提交或者回滚)并释放锁,其他的事务才能修改这份数据。

这就是为什么我们说数据库的隔离级别提供了对写操作的保护。实际上,这种保护是由数据库的并发控制机制(如锁)来实现的,不同的隔离级别使用了不同的并发控制策略,因此提供了不同程度的写操作保护。

7 串行化相关问题

7.1 串行化一定能保证读取的数据是最新的对吧

是的,串行化是数据库隔离级别中最高的级别,它可以保证事务串行执行,从而避免并发执行的事务产生的各种问题,包括读取的数据不是最新的问题。在串行化级别下,事务的执行结果和它们串行执行的结果一致。

7.2 串行化的事务是数据库中的所有事物吗还是某一张表的关联事务,串行化的粒度有多大

串行化的粒度取决于具体的数据库管理系统和它的并发控制机制。在一些数据库系统中,串行化可能会锁定整个数据库,使得所有的事务都必须串行执行。在其他一些数据库系统中,串行化可能只会锁定被事务访问的数据,使得访问不同数据的事务可以并行执行。

mysql中串行化的粒度有多大?

MySQL中的串行化(SERIALIZABLE)隔离级别会对所有的读操作都加锁,以防止其他事务并发修改数据,从而实现事务的串行执行。这意味着在同一时间只有一个事务能够对同一份数据进行操作。所以可以说,MySQL的串行化隔离级别在数据行级别上进行的,具体的粒度取决于事务操作的数据范围。

7.3 串行化机制是不是也可以在客户端实现,比如消息队列单线程消费的场景

是的,串行化机制并不局限于数据库,它可以应用在任何需要并发控制的场景。比如在消息队列中,你可以让每个消费者线程处理一部分消息,使得不同的消费者线程处理的消息不会有交集,这样就可以达到类似于串行化的效果。但需要注意的是,这种方法依赖于消息的分配策略,如果消息不能均匀地分配给每个消费者线程,那么消费者线程可能会出现空闲,导致系统的吞吐量下降。

相关文章:

mysql的基础面经-索引、事务

1 聚簇索引 1 和主键索引的关系 2 和非聚簇索引的关系&#xff0c;其叶子节点存储的是聚簇索引中的主键 3 索引覆盖机制使得非聚簇索引不用回表二次查询 2 举一个使用索引覆盖的例子 我的项目中没有使用到覆盖索引&#xff0c;但是可以举一个例子&#xff0c;比如我直接为年…...

Windows下双网卡配置静态路由,实现内外网同时使用

怎么样设置双网卡&#xff1f;内网外网两个网络这么同时连接&#xff1f; 接下来听好了&#xff0c;赶紧动手 情况描述&#xff1a; 我使用的Windows10电脑&#xff0c;支持双网卡工作 目前我工作需要使用的使用内网&#xff0c;但是又需要使用外网&#xff0c;需要同时使用&a…...

Spring整合Mybatis、Spring整合JUnit

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaweb 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 Spring整合 一、Spring整合Mybatis1.1 整合Mybatis&#x…...

Devops系统中jira平台迁移

需求:把aws中的devops系统迁移到华为云中,其中主要是jira系统中的数据迁移,主要方法为在华为云中建立一套 与aws相同的devops平台,再把数据库和文件系统中的数据迁移,最后进行测试。 主要涉及到的服务集群CCE、数据库mysql、弹性文件服务SFS、数据复制DRS、弹性负载均衡ELB。 迁…...

【雕爷学编程】MicroPython动手做(29)——物联网之SIoT

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…...

LAXCUS分布式操作系统引领科技潮流,进入百度首页

信息源自某家网络平台&#xff0c;以下原样摘抄贴出。 随着科技的飞速发展&#xff0c;分布式操作系统做为通用基础平台&#xff0c;为大数据、高性能计算、人工智能提供了强大的数据和算力支持&#xff0c;已经成为了当今计算机领域的研究热点。近日&#xff0c;一款名为LAXCU…...

Linux--按行读取数据:fgets

函数定义&#xff1a; char *fgets(char *s,int size,FILE *stream); S是指接受数据缓冲区&#xff0c;用于存放stream里读取的数据 size是指缓冲区的大小 返回值为NULL表明读取失败&#xff0c;反之读取成功...

express学习笔记5 - 自定义路由异常处理中间件

修改router/index.js&#xff0c;添加异常处理中间件 *** 自定义路由异常处理中间件* 注意两点&#xff1a;* 第一&#xff0c;方法的参数不能减少* 第二&#xff0c;方法的必须放在路由最后*/ router.use((err, req, res, next) > {console.log(err);const msg (err &…...

filebeat介绍

1、filebeat概述 Filebeat是用于转发和集中日志数据的轻量级传送工具。Filebeat监视您指定的日志文件或位置&#xff0c;收集日志事件&#xff0c;并将它们转发到Elasticsearch或 Logstash或kafka进行索引 1.1 Filebeat两个主要组件 prospector 和 harvester。 prospector&a…...

使用SSM框架实现个人博客管理平台以及实现Web自动化测试

文章目录 前言1. 项目概述2. 项目需求2.1功能需求2.2 其他需求2.3 系统功能模块图 3. 开发环境4. 项目结构5. 部分功能介绍5.1 数据库密码密文存储5.2 统一数据格式返回5.3 登录拦截器 6. 项目展示7. 项目测试7.1 测试用例7.2 执行部分自动化测试用例 前言 在几个月前实现了一…...

【深度学习】MAT: Mask-Aware Transformer for Large Hole Image Inpainting

论文&#xff1a;https://arxiv.org/abs/2203.15270 代码&#xff1a;https://github.com/fenglinglwb/MAT 文章目录 AbstractIntroductionRelated WorkMethod总体架构卷积头Transformer主体Adjusted Transformer Block Multi-Head Contextual Attention Style Manipulation Mo…...

PyTorch BatchNorm2d详解

通常和卷积层&#xff0c;激活函数一起使用...

慕课网Go-4.package、单元测试、并发编程

package 1_1_User.go package usertype User struct {Name string }1_1_UserGet.go package userfunc GetCourse(c User) string {return c.Name }1_1_UserMain.go package mainimport ("fmt"Userch03 "goproj/IMOOC/ch03/user"//别名&#xff0c;防止同名…...

[JavaWeb]SQL介绍-DDL-DML

SQL介绍-DDL-DML 一.SQL简介1.简介2.SQL通用语法3.SQL语言的分类 二.DDL-操作数据库与表1.DDL操作数据库2.DDL操作表①.查询表(Retrieve)②.创建表(Create)③.修改表(Update)④.删除表(Delete) 三.Navicat的安装与使用四.DML-操作表数据1.添加(Insert)2.修改(Update)3.删除(Del…...

git源码安装(无sudo权限)

git源码安装&#xff08;无sudo权限&#xff09; 下载源码解压安装添加到环境变量 下载源码 去https://mirrors.edge.kernel.org/pub/software/scm/git/下载需要的版本。我下载的是2.41.0版本 wget https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.41.0.tar.gz解…...

Web3 叙述交易所授权置换概念 编写transferFrom与approve函数

前文 Web3带着大家根据ERC-20文档编写自己的第一个代币solidity智能合约 中 我们通过ERC-20一种开发者设计的不成文规定 也将我们的代币开发的很像个样子了 我们打开 ERC-20文档 我们transfer后面的函数就是transferFrom 这个也是 一个账号 from 发送给另一个账号 to 数量 val…...

Redis系列二:Clion+MAC+Redis环境搭建

1. ClionMACRedis-3.0-annotated环境搭建 参考&#xff1a; https://github.com/huangz1990/redis-3.0-annotated https://gitee.com/dumpcao/redis-3.0-annotated-cmake-in-clion https://tool.4xseo.com/a/12910.html 1.1 下载并导入Clion git clone https://gitee.com/dum…...

Linux下 Docker容器引擎基础(2)

目录 创建私有仓库 将修改过的nginx镜像做标记封装&#xff0c;准备上传到私有仓库 将镜像上传到私有仓库 从私有仓库中下载镜像到本地 CPU使用率 CPU共享比例 CPU周期限制 CPU 配额控制参数的混合案例 内存限制 Block IO 的限制 限制bps 和iops 创建私有仓库 仓库&a…...

现场服务管理系统有哪些?5个现场服务管理软件对比

现场售后服务管理软件的使用者通常是机械设备、家电、仪表仪器、医疗器械等厂商的工程师和客服调度人员。现场售后服务管理软件可将服务过程标准化&#xff0c;包括工单派发、服务过程步骤、配件订购出货和付款、客户评价都有系统支持&#xff0c;有的现场售后服务软件还支持数…...

leetcode 912.排序数组

⭐️ 题目描述 &#x1f31f; leetcode链接&#xff1a;排序数组 思路&#xff1a; 此题如果使用冒泡插入选择这些时间复杂度 O ( N 2 ) O(N^2) O(N2) 的算法会超时&#xff0c;使用快排 优化也过不去&#xff0c;因为里面有一个测试用例全是 2 即使加了三数取中也会是 O (…...

利用MMPreTrain微调图像分类模型

前言 MMPreTrain是一款基于PyTorch的开源深度学习预工具箱&#xff0c;是OpenMMLab项目的成员之一MMPreTrain的主要特性有&#xff1a; 支持多元化的主干网络与预训练模型支持多种训练策略&#xff08;有监督学习&#xff0c;无监督学习&#xff0c;多模态学习等&#xff09;提…...

express学习笔记3 - 三大件

便于统一管理router&#xff0c;创建 router 文件夹&#xff0c;创建 router/index.js&#xff1a; const express require(express)// 注册路由 const router express.Router() router.get(/,function(req,res){res.send(让我们开始express之旅) }) /*** 集中处理404请求的…...

Java课题笔记~Maven基础

2、Maven 基础 2.1 Maven安装与配置 下载安装 配置&#xff1a;修改安装目录/conf/settings.xml 本地仓库&#xff1a;存放的是下载的jar包 中央仓库&#xff1a;要从哪个网站去下载jar包 - 阿里云的仓库 2.2 创建Maven项目...

三步问题(力扣)n种解法 JAVA

目录 题目&#xff1a;1、dfs:2、dfs 备忘录&#xff08;剪枝&#xff09;&#xff1a;&#xff08;1&#xff09;神器 HashMap 备忘录&#xff1a;&#xff08;2&#xff09;数组 memo 备忘录&#xff1a; 3、动态规划&#xff1a;4、利用 static 的储存功能&#xff1a;&…...

flask---》登录认证装饰器/配置文件/路由系统

登录认证装饰器 # 0 装饰器的本质原理-# 类装饰器&#xff1a;1 装饰类的装饰器 2 类作为装饰器 # 1 装饰器使用位置&#xff0c;顺序 # 3 flask路由下加装饰器&#xff0c;一定要加endpoint-如果不指定endpoint&#xff0c;反向解析的名字都是函数名&#xff0c;不加装饰器…...

Jvm实际运行情况-JVM(十七)

上篇文章说jmap和jstat的命令&#xff0c;如何查看youngGc和FullGc耗时和次数。 Jmap-JVM&#xff08;十六&#xff09; Jvm实际运行情况 背景&#xff1a; 机器配置&#xff1a;2核4G JVM内存大小&#xff1a;2G 系统运行天数&#xff1a;7天 期间发生FULL GC次数和耗时…...

【BASH】回顾与知识点梳理(二)

【BASH】回顾与知识点梳理 二 二. Shell 的变量功能2.1 什么是变量&#xff1f;2.2 变量的取用与设定: echo, 变量设定规则: set/unset2.3 环境变量的功能用 set 观察所有变量 (含环境变量与自定义变量)export&#xff1a; 自定义变量转成环境变量那如何将环境变量转成自定义变…...

【分布式训练】Accelerate 多卡训练,单卡评测,进程卡住的解决办法

最近想把之前的一个模型的改成多卡训练的。我并不懂DDP&#xff0c;DP。一开始打算使用Transformers的Trainer&#xff0c;但是配置的过程踩了很多坑也没有弄成功。【我是自己写的评测方法&#xff0c;但是我找不到能让触发Trainer去用我的方法评测的路劲】&#xff0c;后来偶然…...

时间复杂度为O(nlogn)的两种排序算法

1.归并排序 归并排序的核心思想&#xff1a;如果要排序一个数组&#xff0c;我们先把数组从中间分成前后两部分&#xff0c;然后对前后两部分分别排序&#xff0c;再将排好序的两部分合并在一起&#xff0c;这样整个数组就都有序了。 归并排序使用的就是分治思想。分治&#x…...

java调用onnx模型,支持yolov5和yolov7

不点star不给解答问题 可直接运行主文件&#xff1a;ObjectDetection_1_25200_n.java 或者 ObjectDetection_n_7.java 都可以直接运行两个可以运行的主文件是为了支持不用网络结构的模型&#xff0c;即使是onnx模型&#xff0c;输出的结果参数也不一样&#xff0c;支持以下两种…...