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

JAVA面试数据库篇

目录

一.优化

1.MYSQL中,如何定位慢查询?

2.SQL语句执行慢,如何分析呢?

3.索引

了解过索引吗?(什么是索引)

索引的底层数据结构了解过吗?

B树和B+树的区别是什么呢?

什么是聚簇索引什么是非聚簇索引?/什么是聚集索引,什么是二级索引(非聚集索引)?什么是回表?

知道什么叫覆盖索引吗?

MYSQL超大分页怎么处理?

索引创建原则有哪些?

什么情况下索引会失效?


一.优化

1.MYSQL中,如何定位慢查询?

  • 聚合查询

  • 多表查询

  • 表数据量过大查询

  • 深度分页查询

表象:页面加载过慢、接口压测响应时间过长(超过1s)

方案一:开源工具

  • 调试工具:Arthas

  • 运维工具:Prometheus、Skywalking(查看接口的执行情况、时间)

方案二:MySQL自带慢日志

慢查询日志记录了所有执行超过指定参数(long_querey_time,单位秒,默认10秒)的所有SQL语句日志。

  • 若要开启慢查询日志,需要在MySQL的配置文件(/etc/my.cnf)中配置如下信息:

#开启慢查询日志查询开关
slow_query_log=1
#设置慢日志的时间为2秒,SQL语句超过两秒,就会记录慢日志
long_query_time=2

配置完成后,重启mysql服务器测试,可以通过查询Localhost-slow.log文件查看语句执行信息。

回答:

曾经在测试接口的时候发现非常慢,压测的结果大概在5秒左右;

我们系统中当时采用了运维工具(skywalking),可以检测出哪个接口,最终因为是sql的问题;

在Mysql中开启了慢日志查询,我们设置的时间是2秒,一旦sql超过2秒就会记录到日志中(调试阶段)。

2.SQL语句执行慢,如何分析呢?

根据上面的几种查询方式,可以使用MySQL自带的分析工具DESC或EXPLAIN来分析。

  • 通过key和key_len(即sql实际命中的索引以及索引占用的大小)检查是否命中了索引(即索引本身是否失效)

  • 通过type字段查看sql是否有进一步的优化空间,是否存在全索引扫描或全盘扫描(即index和all)

  • 通过extra建议判断,是否出现了回表情况(using index condition),如果出现了,可以尝试添加索引或修改返回字段来回复。

3.索引

了解过索引吗?(什么是索引)

  • 索引是帮助MySQL高效获取数据的有序数据结构

  • 索引能提高数据检索的效率,降低数据库的IO成本(不需要全表扫描)

  • 通过索引对数据进行排序,降低数据排序的成本,降低了CPU的消耗

索引的底层数据结构了解过吗?

MySQL的搜索引擎也就是InnoDB引擎默认采取的是B+树的结构存储索引

  • 一方面,它的阶数更多,路径更短(B树是5阶,每个节点最多存储4个Key)

  • 另一方面,B+树的磁盘读写代价更低,非叶子节点只存储指针,叶子节点存储数据

  • 最后一点,B+树便于扫库和区间查询,叶子节点是一个双向链表

B树和B+树的区别是什么呢?

  • 第一:在B树中,非叶子节点和叶子节点都会存放数据,而B+树的所有的数据都会出现在叶子节点,在查询的时候,B+树查找效率更加稳定

  • 第二:在进行范围查询的时候,B+树效率更高,因为B+树都在叶子节点存储,并且叶子节点是一个双向链表

什么是聚簇索引什么是非聚簇索引?/什么是聚集索引,什么是二级索引(非聚集索引)?什么是回表?

  • 聚簇索引数据与索引放到一块,B+树里的叶子节点里保存整行的数据,有且只有一个,一般都是表的主键

  • 二级索引是数据与索引分开存储,B+树的叶子节点里保存对应的主键,可以有多个

回表是指通过二级索引找到对应的主键,再根据主键通过聚集索引找到整行数据。

知道什么叫覆盖索引吗?

覆盖索引是指返回的列被查询的索引全部包含。

  • 比如典型的根据主键id查询就是覆盖索引,叶子节点包含了整行数据

  • 同时我们应该避免返回的列需要创建索引,因为这样可能会触发回表,降低效率,所以应当避免使用select *

MYSQL超大分页怎么处理?

MySQL超大分页一般出现在使用limit语句对大量数据进行处理和排序,越到后面,查询效率越低。

我们可以通过覆盖索引+子查询来提高查询效率。

具体的做法是先根据id查询作为子查询的结果,再和原表根据id联查,因为id查询是覆盖索引,所以效率会快很多。

原语句:select * from user limit 9000000,10;
优化:selct * form user u,(select id from user order by id limit 9000000,10) t where u.id=t.id

索引创建原则有哪些?

  • 当数据量比较大,查询比较频繁的表,适合建立索引(超过10万)

  • 经常作为查询条件、排序、分组的字段

  • 字段内容区分度高

  • 内容长,使用前缀索引

  • 尽量使用联合索引

  • 控制索引的数量

  • 如果索引列不能存储NULL值,请在创建表时使用NOT NULL约束

嗯,这个情况有很多,不过都有一个大前提,就是表中的数据要超过10万以上,我们才会创建索引,并且添加索引的字段是查询比较频繁的字段,一般也是像作为查询条件,排序字段或分组的字段这些。 还有就是,我们通常创建索引的时候都是使用复合索引来创建,一条sgl的返回值,尽量使用覆盖索引,如果字段的区分度不高的话,我们也会把它放在组合索引后面的字段。如果某一个字段的内容较长,我们会考虑使用前缀索引来使用,当然并不是所有的字段都要添加索引,这个索引的数量也要控制,因为添加索引也会导致新增改的速度变慢。

什么情况下索引会失效?

索引失效的情况有很多,可以说一些自己遇到过的,不要张口就得得得说一堆背诵好的面试题适当的思考一下,回想一下,更真实)

当使用联合索引的时候

  1. 违反最左前缀法则

  2. 或者使用%开头进行模糊查询

  3. 或者字符串没加单引号,此时发生了类型转换

  4. 或者对索引列进行运算操作,比如substring

  5. 或者在范围查询右侧的列

嗯,这个情况比较多,我说一些自己的经验,以前遇到过的

比如,索引在使用的时候没有遵循最左匹配法则,第二个是,模糊查询,如果%号在前面也会导致索引失效。如果在添加索引的字段上进行了运算操作或者类型转换也都会导致索引失效。

我们之前还遇到过一个就是,如果使用了复合索引,中间使用了范围查询,右边的条件索引也会失效所以,通常情况下,想要判断出这条sql是否有索引失效的情况,可以使用explain执行计划来分析

相关文章:

JAVA面试数据库篇

目录 一.优化 1.MYSQL中,如何定位慢查询? 2.SQL语句执行慢,如何分析呢? 3.索引 了解过索引吗?(什么是索引) 索引的底层数据结构了解过吗? B树和B树的区别是什么呢? 什么是聚…...

Android高手进阶教程(三)之----Android 中自定义View的应用.

大家好我们今天的教程是在Android 教程中自定义View 的学习&#xff0c;对于初学着来说&#xff0c;他们习惯了Android 传统的页面布局方式&#xff0c;如下代码: <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"htt…...

第一百一十三回 dart中的getter/setter方法

文章目录 概念介绍使用方法示例代码使用扩展 我们在上一章回中介绍了 flutter_screenutil包相关的内容&#xff0c;本章回中将介绍 dart中的setter/getter方法.闲话休提&#xff0c;让我们一起Talk Flutter吧。 概念介绍 我们在这里介绍的setter/getter方法属于编程语言中的…...

搭建Docker环境

目录 一、docker环境搭建 1、卸载旧版本docker 2、安装依赖和设置仓库 3、安装docker 4、启动并加入开机启动 5、验证是否安装成功 二、利用docker搭建nginx 1、拉取镜像 2、启动容器&#xff0c;部署nginx 一、docker环境搭建 1、卸载旧版本docker yum remove docke…...

微服务08-多级缓存

1.什么是多级缓存 传统的缓存策略一般是请求到达Tomcat后,先查询Redis,如果未命中则查询数据库,如图: 存在下面的问题: •请求要经过Tomcat处理,Tomcat的性能成为整个系统的瓶颈 •Redis缓存失效时,会对数据库产生冲击 多级缓存就是充分利用请求处理的每个环节,分…...

Intel汇编和ATT汇编的区别?

一、前缀不同 在 Intel 语法中&#xff0c;没有寄存器前缀或立即前缀。 然而&#xff0c;在 AT&T 中&#xff0c;寄存器的前缀是“%”&#xff0c;而 immed 的前缀是“$”。 Intel 语法十六进制或二进制即时数据分别带有“h”和“b”后缀。 此外&#xff0c;如果第一个十六…...

MongoDB 备份与恢复

1.1 MongoDB的常用命令 mongoexport / mongoimport mongodump / mongorestore 有以上两组命令在备份与恢复中进行使用。 1.1.1 导出工具mongoexport Mongodb中的mongoexport工具可以把一个collection导出成JSON格式或CSV格式的文件。可以通过参数指定导出的数据项&#xff0c…...

探讨uniapp的网络通信问题

uni-app 中有很多原生的 API&#xff0c;其中我们经常会用到的肯定有&#xff1a;uni.request(OBJECT) method 有效值 注意&#xff1a;method有效值必须大写&#xff0c;每个平台支持的method有效值不同&#xff0c;详细见下表。 success 返回参数说明 data 数据说明 最终…...

【左神算法刷题班】第18节:汉诺塔问题、岛屿问题、最大路径和问题

第18节 题目1&#xff1a;汉诺塔问题&#xff08;变体&#xff09; 体系学习班18节有讲暴力递归的汉诺塔原题。 给定一个数组arr&#xff0c;长度为N&#xff0c;arr中的值只有1&#xff0c;2&#xff0c;3三种 arr[i] 1&#xff0c;代表汉诺塔问题中&#xff0c;从上往下第…...

网络安全体系架构介绍

网络安全体系是一项复杂的系统工程&#xff0c;需要把安全组织体系、安全技术体系和安全管理体系等手段进行有机融合&#xff0c;构建一体化的整体安全屏障。针对网络安全防护&#xff0c;美国曾提出多个网络安全体系模型和架构&#xff0c;其中比较经典的包括PDRR模型、P2DR模…...

JSP实训项目设计报告—MVC简易购物商城

JSP实训项目设计报告—MVC简易购物商城 文章目录 JSP实训项目设计报告—MVC简易购物商城设计目的设计要求设计思路系统要求单点登录模块商品展示模块购物车展示模块 概要设计Model层View层Controller层 详细设计Model层View层登录界面系统主界面 Controller层 系统运行效果项目…...

41、可靠传输——停等ARQ

前面两节内容我们学习了传输层的基本概况的一些知识&#xff0c;包括传输层在TCP/IP协议栈中负责的任务、传输层的两大协议&#xff0c;以及端口号、套接字等一些基本的概念。从这一节开始&#xff0c;我们将开启两大协议中TCP协议的学习。 但是&#xff0c;经过之前的学习&am…...

RK3568 cmake编译

一.简介 CMake是开源、跨平台的构建工具&#xff0c;可以让我们通过编写简单的配置文件去生成本地的Makefile&#xff0c;这个配置文件是独立于运行平台和编译器的&#xff0c;这样就不用亲自去编写Makefile了&#xff0c;而且配置文件可以直接拿到其它平台上使用&#xff0c;…...

详细安装配置django

安装配置使用Django。 1&#xff0c;下载安装 django pip install django 2.创建设置项目 先进入要放置项目的文件夹下 2.1&#xff0c; 创建项目 django-admin startproject Api_project 2.2&#xff0c; 创建app命令 cd Api_project dir看一下是否有 manage.py 文件…...

HTTP之cookie基础学习

目录 Cookie 什么是Cookie Cookie分类 Cookie版本 Cookie工作原理 Cookie详解 创建cookie cookie编码 cookie过期时间选项 Cookie流程 Cookie使用 会话管理 个性化信息 记录用户的行为 Cookie属性 domain选项 path选项 secure选项 cookie…...

观察者模式和发布订阅模式

观察者模式与发布订阅模式的区别&#xff1a; 1、观察者模式中只有观察者和被观察者&#xff0c;发布订阅模式中有发布者、订阅者、调度中心 2、观察者模式是被观察者发生变化时自己通知观察者&#xff0c;发布订阅模式是通过调度中心来进行分布订阅操作 发布订阅模式 class …...

利用ViewModel和LiveData进行数据管理

利用ViewModel和LiveData进行数据管理 1. 引言 在当今移动应用开发的世界中&#xff0c;数据管理是一个至关重要的方面。随着应用的复杂性不断增加&#xff0c;需要有效地管理和维护应用中的数据。无论是从服务器获取数据、本地数据库存储还是用户界面的状态&#xff0c;数据…...

前后端分离------后端创建笔记(05)用户列表查询接口(下)

本文章转载于【SpringBootVue】全网最简单但实用的前后端分离项目实战笔记 - 前端_大菜007的博客-CSDN博客 仅用于学习和讨论&#xff0c;如有侵权请联系 源码&#xff1a;https://gitee.com/green_vegetables/x-admin-project.git 素材&#xff1a;https://pan.baidu.com/s/…...

浅谈GIS和三维GIS的区别?

GIS&#xff08;地理信息系统&#xff09;和三维GIS&#xff08;3D地理信息系统&#xff09;是地理信息领域的两个重要概念&#xff0c;它们在地理数据的处理和分析方面具有不同的特点和应用。可能很多人分不清二者的区别&#xff0c;本文就带大家简单了解一下二者的区别。 定义…...

ArcGIS Maps SDK for JavaScript系列之三:在Vue3中使用ArcGIS API加载三维地球

目录 SceneView类的常用属性SceneView类的常用方法vue3中使用SceneView类创建三维地球项目准备引入ArcGIS API创建Vue组件在OnMounted中调用初始化函数initArcGisMap创建Camera对象Camera的常用属性Camera的常用方法 要在Vue 3中使用ArcGIS API for JavaScript加载和展示三维地…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S &#xff08;client/server 客户端/服务器&#xff09;&#xff1a;由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序&#xff0c;负责提供用户界面和交互逻辑 &#xff0c;接收用户输入&#xff0c;向服务器发送请求&#xff0c;并展示服务…...

STM32HAL库USART源代码解析及应用

STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...

GitHub 趋势日报 (2025年06月06日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...

uniapp 字符包含的相关方法

在uniapp中&#xff0c;如果你想检查一个字符串是否包含另一个子字符串&#xff0c;你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的&#xff0c;但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...