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

【Java面试】四、MySQL篇(上)

在这里插入图片描述

文章目录

  • 1、定位慢查询
  • 2、慢查询的原因分析
  • 3、索引
    • 3.1 数据结构选用:二叉树 & 红黑树
    • 3.2 数据结构选用:B+树
  • 4、聚簇索引、非聚簇索引、回表查询
    • 4.1 聚簇索引、非聚簇索引
    • 4.2 回表查询
  • 5、覆盖索引、超大分页优化
    • 5.1 覆盖索引
    • 5.2 超大分页处理
  • 6、索引的创建
  • 7、索引的失效
  • 8、SQL优化的经验
  • 9、面试

1、定位慢查询

  • Arthas在线查看方法耗时
  • 运维工具Prometheus
  • 链路追踪工具Skywalking、Zipkin、OpenTemplate

在这里插入图片描述

  • MySQL自带的慢日志:记录执行超过n秒的SQL
//修改配置文件,文件位置
/etc/my.cnf//开启慢查询开关,生产环境不建议开启,会损失部分性能
slow_query_log=1//设置超过2秒的SQL
long_query_time=2

慢SQL被记录到/var/lib/mysql/localhost-slow.log

在这里插入图片描述

2、慢查询的原因分析

慢SQL通常是因为:

  • 聚合查询
  • 多表查询
  • 表数据量过大查询
  • 深度分页查询

前三种,可尝试使用SQL执行计划分析原因:

# SELECT语句前添加EXPLAIN或DESC,查看SQL语句执行情况的信息
EXPLAIN select * from t_table;
DESC select * from t_table;

在这里插入图片描述
此时SELECT返回的不是表数据,是一些执行信息:

  • possible: key 当前sql可能会使用到的索引
  • key: 当前sql实际命中的索引
  • key_len: 索引占用的大小,key和key_len搭配,检查是否存在索引失效
  • Extra:额外的优化建议

在这里插入图片描述

  • type:这条sql的连接的类型,性能由好到差为NULL、system、const、eq_ref、ref、range、index、all
system:查询MySQL系统内置库的表const:根据主键查询eq_re:主键索引查询或唯一索引查询ref:索引查询range:范围查询index:索引树扫描,遍历整个索引all:不走索引,全盘扫描

3、索引

一种用于高效查数据的数据结构,以某种方式指向表里的数据。如下表,不加索引,查age=45的数据,就是逐行对比 + 遍历整个表直至最后一行,效率低下

在这里插入图片描述

如果去维护一个类似二叉树的结构,再查age=45的数据,则直接从根节点开始⇒ 45 > 36,去右侧 ⇒ 45 < 48 ⇒去左侧 ⇒ 查找完毕,如此,查找效率提升,这即索引的思想

3.1 数据结构选用:二叉树 & 红黑树

MySQL索引底层的数据结构是B+树。不选二叉树是因为:

在这里插入图片描述
如果数据递增或递减,此时二叉树变链表,即最坏情况的二叉树效率很低。既然二叉树有平衡性问题,那再考虑自平衡的二叉树 ⇒ 红黑树

在这里插入图片描述

红黑树时间复杂度为O(log n),但其也是一个二叉树,每个节点最多只能两个分支,因此,大数据量下,红黑树会很高。 ⇒ B树,每个节点可以多个分支,是一种多叉路衡查找树。以一颗5阶B树为例(最大度数mas-degree为5,每个节点最多存储4个key)

在这里插入图片描述

图中的灰色部分,存储指针,指向子节点。如20左侧的指针,指向的就是20以内的数据,20和30之间的指针,则指向20~30之间的数据,以此类推。且绿色部分存储的是对应的那条数据。

3.2 数据结构选用:B+树

相比二叉树,B树是一种矮胖树,B+树则是B树的一种优化,非叶子节点只存储指针,不存储数据。只有在叶子节点才去存储对应的数据,前面的非叶子节点起一个导航的作用,非叶子节点上就匹配到的数据,在叶子节点上也能找到这个数。

在这里插入图片描述

MySQL默认的存储引擎InnoDB默认使用B+树实现索引。相比B树,B+树:

  • 磁盘读写代价更低(只有叶子节点存数据)
  • 查询效率更稳定(最后都要落到叶子节点)
  • 适合于区间查询(叶子节点之间的双向指针,比如查6~34这个区间的数,先从根节点对比,走左边,到16,再走左边,到6,再跟双向指针拿到6到34的数据,不需要再从根节点开始重新找一次

4、聚簇索引、非聚簇索引、回表查询

4.1 聚簇索引、非聚簇索引

聚簇索引(又叫聚集索引),即B+树的叶子节点保存的是整行数据。非聚簇索引(又叫二级索引),即B+树单独叶子节点存储的是那行数据对应的主键

在这里插入图片描述
聚簇索引选取规则:(节点里存哪个)

  • 如果存在主键,主键索引就是聚集索引
  • 如果不存在主键,将使用第一个唯一(UNIQUE)索引作为聚集索引
  • 如果表没有主键,或没有合适的唯一索引,则InnoDB 会自动生成一个rowid 作为隐藏的聚集索引

如下:建立聚簇索引时,这张表有主键ID,因此,节点中存储的是ID值,最后,叶子节点中存的那个row是整条数据值。

在这里插入图片描述

再比如给表的name字段建立非聚簇索引,节点存储name的值,最后的叶子节点,存储的是这条数据的主键值

4.2 回表查询

select * form user where name = 'Arm';

给name字段加了非聚簇索引,因此,执行如上SQL,先根据name的非聚簇索引的B+树 ⇒ A小于L,走左边,到G和J,再走左边,找到Arm ⇒ 因为是select *,而非聚簇索引的叶子节点存的是主键 ⇒ 拿着主键,回到聚簇索引,从其根节点开始查 ⇒ 聚簇索引的叶子节点存了整行数据,返回select * 的结果

在这里插入图片描述

总之,回表查询就是:先根据非聚簇索引找到主键值,再根据主键值到聚簇索引拿到整行数据

5、覆盖索引、超大分页优化

5.1 覆盖索引

即查询使用了索引,并且你需要返回的字段,在索引中能够全部找到。

在这里插入图片描述

select * form tb_user where id = 1;

是覆盖索引,虽然select * ,但其where是根据id过滤的,即用的是主键索引、聚簇索引,索引的叶子节点存了整行数据,需要返回的字段,在索引中能够全部找到

在这里插入图片描述

select id, name from tb_user where name = 'Arm';

是覆盖索引,where根据name过滤,走name的非聚簇索引,最后叶子节点存了id,而最后需要返回的就是id和name

在这里插入图片描述

select id, name, gender from tb_user where name = 'Arm';

不是覆盖索引,索引中拿不到gender值,需要回表查询

在这里插入图片描述

很明显,能一次查询出来的,符合覆盖索引的,效率最高,走回表查询的SQL,效率低

5.2 超大分页处理

使用limit分页查,需要对数据进行排序,数据量很大时,效率很低

在这里插入图片描述

比如,limit 900 0000,10,此时,需要排序前9000010行数据,再返回9000000到9000010行这10行:

在这里插入图片描述

解决方案是:覆盖索引 + 子查询

在这里插入图片描述
即先根据主键去分页order by id ,不select *,而是select id,再和原来的表关联查

6、索引的创建

需要创建索引的场景:

  • 数据量大(单表超过10万行),且查询频繁
  • 给常作为where、order by、group by操作的字段创建索引
  • 如果字段是字符串类型,且长度很长,给其建立索引压力大,可截取前几个字,建立前缀索引

在这里插入图片描述

  • 多用联合索引,而不是单列索引。因为如果给A + B两个字段建立了联合索引,刚好又select A, B from table where A = 1;就是覆盖索引,避免了回表,查询效率更高。下图即给name、status、address三个字段建了联合索引

在这里插入图片描述

  • 索引并不是越多越好,因为增删改也要同步去维护索引,索引多了,会影响增删改的效率

7、索引的失效

给表tb_seller的name,status,address字段创建联合索引:

在这里插入图片描述
索引失效的场景:

1)违反最左前缀法则

最左前缀法则,即select后面的字段,必须从索引的最左前列开始,并且不跳过索引中的列。以下为索引不失效的写法:

在这里插入图片描述

以下写法索引失效:
在这里插入图片描述
以下写法,中途跳过了联合索引的某一列,只有最左侧字段索引生效,从key_len的大小可以看出,其只命中了一个字段:

在这里插入图片描述

2)对status范围查询,则status右边的列address没有用到索引,但name,status还是走了索引了

在这里插入图片描述

3)在索引所在的列上进行运算,索引会失效

在这里插入图片描述

4)字符串不加单引号,索引失效

因为不对字符串类型加单引号,MySQL优化器会自动进行类型转换,造成索引失效
在这里插入图片描述

5)以%开头的Like模糊查询,索引失效

注意:如果仅仅是末尾进行模糊查询,索引不会失效

在这里插入图片描述

8、SQL优化的经验

1)表设计优化:

  • 设置合适的数值类型:tinyint、int、bigint
  • 字符串类型,char和varchar,char定长、效率高,varchar长度灵活可变,根据字符串实际长度来,但效率稍低

在这里插入图片描述

2)SQL语句优化

  • 避免select *
  • 避免索引失效的写法
  • 使用union all代替union,union会把两个查询的结果再做个去重

在这里插入图片描述

  • 避免where中对字段进行计算操作
  • join表时,能用inner join,不left join或者right join,业务必须要用时,可将小表(行数少的表)放外面。原因参考for循环嵌套,如下写法,MySQL进行三次连接,每次连接进行1000次操作,反之就是进行1000次连接,每次连接进行3次操作(inner join 就会自动优化,把小表放外面。left join或right join就不会把小表放外面)

在这里插入图片描述
3)读写分离,主从复制

  • 用于避免写操作影响查询效率
  • 主库写,从库读

在这里插入图片描述
4)索引的创建和失效
5)分库分表(见下篇)

9、面试

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

相关文章:

【Java面试】四、MySQL篇(上)

文章目录 1、定位慢查询2、慢查询的原因分析3、索引3.1 数据结构选用&#xff1a;二叉树 & 红黑树3.2 数据结构选用&#xff1a;B树 4、聚簇索引、非聚簇索引、回表查询4.1 聚簇索引、非聚簇索引4.2 回表查询 5、覆盖索引、超大分页优化5.1 覆盖索引5.2 超大分页处理 6、索…...

【Python】collections模块:高效处理数据的利器

Python中的collections模块&#xff1a;高效处理数据的利器 Python的collections模块是一个内置模块&#xff0c;它提供了一些专用的容器数据类型&#xff0c;作为Python通用内置容器&#xff08;如列表list、字典dict、集合set和元组tuple&#xff09;的替代品。本文将深入探…...

Vue3实战笔记(51)—Vue 3封装带均线的k线图

文章目录 前言带均线的k线图总结 前言 继续封装一个封装带均线的k线图 带均线的k线图 EChartsCandlestickSh.vue&#xff1a; <template><div ref"chartContainer" style"width: 100%; height: 500px"></div></template><scr…...

信息与未来2015真题笔记

[信息与未来 2015] 加数 题目描述 给出一个正整数 n n n&#xff0c;在 n n n 的右边加入 ⌊ n 2 ⌋ \left\lfloor\dfrac n2\right\rfloor ⌊2n​⌋&#xff0c;然后在新数的右边 再加入 ⌊ ⌊ n 2 ⌋ 2 ⌋ \left\lfloor\dfrac{\left\lfloor\dfrac n2\right\rfloor}2\rig…...

【成功解决】Access token invalid or no longer valid

项目场景&#xff1a; python调用文心一言对应的ERNIE-4.0-8K模型API接口&#xff0c;方式为单次调用 问题描述 提示&#xff1a; “error_code”: 110, “error_msg”: “Access token invalid or no longer valid” C:\Users\PUB\AppData\Local\Programs\Python\Python38-…...

【Bug】修改计算机名称出现ip无法连接mysql数据库

解决&#xff1a; mysql -u root -p输入密码登录mysql服务器&#xff0c;那个ip是本机ip4的地址单ip放行。推荐全部&#xff0c;后面123456是密码 GRANT ALL PRIVILEGES ON *.* TO root192.168.0.109 IDENTIFIED BY 123456; 全部IP都放行 GRANT ALL PRIVILEGES ON *.* …...

米尔MYC-Y6ULX-V2开发板测评记录

文章目录 1、板子上手体验2、板载硬件3、系统信息4、 驱动测试5、编译linux三大件7、摄像头测试9、总结 1、板子上手体验 首先非常感谢芯查查给了这样一个机会来测评这样一款性能十分强大的开发板&#xff0c;我拿到手的是MYC-Y6ULX-V2核心板及开发板&#xff0c;这块板子具有…...

装修全流程

Summary 从2023年底到现在&#xff08;2024年6月2日&#xff09;&#xff0c;装修可以定的东西基本过半了&#xff0c;我按照时间顺序把每个环节的内容和想法都记录一下 环节 选装修公司、找设计师设计环节预算计算角色介绍建材选型敲墙和开工水电放样泥工木工放样To be cont…...

探索微软Edge

微软开发的官方浏览器 Microsoft Edge是微软基于 Chromium 开源项目及其他开源软件开发的网页浏览器。 2015年4月30日&#xff0c;微软在旧金山举行的Build 2015开发者大会上宣布——Windows 10内置代号为“Project Spartan”的新浏览器被正式命名为“Microsoft Edge”&#x…...

Java面试——专业技能

优质博文&#xff1a;IT-BLOG-CN 一、简单讲下 Java 的跨平台原理 由于各个操作系统&#xff08;Windows&#xff0c;Linux等&#xff09;支持的指令集不是完全一致的。就会让我们程序在不同的操作系统上要执行不同的程序代码。Java 开发了适用于不同操作系统及位数的 Java 虚拟…...

C#按钮样式设置XMAL

统一按钮样式 <Window.Resources> <!--按钮样式统一设置&#xff0c;个别按钮单独定义样式的话则需要在定义按钮位置单独设置--><Style TargetType"Button"><Setter Property"Background" Value"Red"/><Setter Prop…...

EmmyLua注释详解

Lua EmmyLua 注解详解 Why 为了使 IDE 编码体验和强语言相近 让 IDE 提前发现编码错误 BUG 查找更方便 代码阅读更方便 建议 明确字段类型 明确字段访问修饰符 明确方法参数类型 善用 “:” 继承 “|” 或 ","多个 支持格式 –类 —class MY_TYPE[:PARENT_TYPE] [com…...

Linux内核 -- 启用 Linux 内核调试信息

启用 Linux 内核调试信息 本文档提供了如何在编译 Linux 内核时启用调试信息的逐步指南。调试信息对于调试和诊断内核问题至关重要。 启用调试信息的步骤 1. 进入内核源代码目录 打开终端并导航到 Linux 内核源代码目录&#xff1a; cd /path/to/linux-kernel2. 配置内核 …...

vs2019 无法打开QT的UI文件

/* * --------------------------- Microsoft Visual StudioQt5.15.2\5.15.2\msvc2019_64 --------------------------- D:\QT_Project_vs\QtWidgetsApplication1\QtWidgetsApplication1\QtWidgetsApplication1.ui 无法打开文件。 --------------------------- 确定 -------…...

Python | A + B问题|||

if语句&#xff1a;if、elif、else 关系运算符 逻辑运算符&#xff1a;and&#xff08;&&&#xff09;、or&#xff08;||&#xff09;、not&#xff08;&#xff01;&#xff09; break退出循环 continue&#xff1a;只能出现在for、while循环内部&#xff0c;用法…...

JRT连接希森美康出图

良好的设计源自实践&#xff0c;优秀的基础决定上限 上一篇用JRT连设备实现了比较有难度的Sebia绘图设备和TCP模式连接。这次连接最常见的检验设备&#xff08;西森美康&#xff09;&#xff0c;读文件和图上传出图。 视频演示 结果格式 通道对应 接口设置 接口处理实现…...

UVa11604 General Sultan

UVa11604 General Sultan 题目链接题意分析AC 代码 题目链接 UVA - 11604 General Sultan 题意 给出一些0和1组成的模式串&#xff0c;问是否存在一个串使得有多种方案将这个串分解成模式串。    给一个包含n&#xff08;n≤100&#xff09;个符号的二进制编码方式&#xff…...

USB - ACK、NAK和STALL的含义

在 USB&#xff08;通用串行总线&#xff09;通信中&#xff0c;术语 ACK、NAK 和 STALL 指的是用于控制数据流和错误处理的握手数据包。下面是对每个术语的详细解释&#xff1a; ACK&#xff08;确认&#xff09;&#xff1a; ACK 数据包由接收方发送给发送方&#xff0c;以表…...

查看 WSL2 (Windows Subsystem for Linux 2) IP 地址

查看 WSL2 [Windows Subsystem for Linux 2] IP 地址 1. ipconfig2. ping $(hostname).local3. cat /etc/resolv.conf4. ip route show5. ip addrReferences 1. ipconfig Windows 系统上与 WSL2 (Windows Subsystem for Linux 2) 接口的地址 172.31.32.1。 Microsoft Windows…...

如何判断一个JavaScript对象是否为空?

在JavaScript的世界里,"空对象"这一术语的含义在不断演变。随着ECMA Script的更新和改进,判断一个对象是否为空变得更加复杂。本文将详细介绍如何判断一个JavaScript对象是否为空,并讨论各种解决方案的优缺点。 历史背景 在理解如何判断一个对象是否为空之前,我…...

5分钟搞定电脑风扇噪音!FanControl超详细配置指南让你告别“飞机起飞“

5分钟搞定电脑风扇噪音&#xff01;FanControl超详细配置指南让你告别"飞机起飞" 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcod…...

手把手调试:从V8引擎的ArrayBuffer到WebAssembly,一步步拆解Chrome CVE-2020-6507漏洞利用链

深入解析Chrome V8引擎漏洞利用&#xff1a;从ArrayBuffer到WebAssembly的内存操控实战 浏览器安全研究领域近年来持续升温&#xff0c;其中V8引擎作为Chrome和Node.js的核心组件&#xff0c;其安全性直接影响着数十亿用户。本文将带您深入探索一个典型V8漏洞&#xff08;CVE-2…...

保姆级教程:手把手教你用Python+Control库仿真PLL噪声传递函数

保姆级教程&#xff1a;手把手教你用PythonControl库仿真PLL噪声传递函数 锁相环&#xff08;PLL&#xff09;作为现代电子系统中的核心组件&#xff0c;其噪声特性直接影响通信质量、时钟精度等关键指标。但教科书上复杂的传递函数公式总让人望而生畏——直到你发现用几行Pyth…...

旧设备优化与系统兼容性提升:OpenCore Legacy Patcher全流程指南

旧设备优化与系统兼容性提升&#xff1a;OpenCore Legacy Patcher全流程指南 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher OpenCore Legacy Patcher是一款专…...

保姆级教程:用Cadence Sigrity Power DC为海思HI3516A板卡提取电源树(附常见报错处理)

从零掌握Cadence Sigrity Power DC电源树提取&#xff1a;HI3516A实战避坑指南 刚拿到海思HI3516A评估板时&#xff0c;电源网络分析往往是硬件工程师的第一个拦路虎。面对密密麻麻的PCB走线和数十个电源域&#xff0c;传统手动梳理方式不仅耗时费力&#xff0c;还容易遗漏关键…...

终极指南:如何实时监控Slonik连接池状态与性能指标

终极指南&#xff1a;如何实时监控Slonik连接池状态与性能指标 【免费下载链接】slonik A Node.js PostgreSQL client with runtime and build time type safety, and composable SQL. 项目地址: https://gitcode.com/gh_mirrors/sl/slonik Slonik作为一款为Node.js打造…...

Transformer位置编码避坑指南:手把手教你用RoPE解决长文本外推难题(附Torch复现)

Transformer长文本处理实战&#xff1a;RoPE位置编码的工程化解决方案 在构建现代NLP系统时&#xff0c;处理长文本序列一直是Transformer架构面临的重大挑战。当序列长度超过模型预训练时的最大位置编码范围时&#xff0c;传统方法的性能会显著下降。这种现象在构建聊天机器人…...

【Hung-yi Lee】《Introduction to Generative Artificial Intelligence》(6)

图片来自于 midjourney Introduction to Generative AI 2024 Spring 文章目录第11講&#xff1a;大型語言模型在「想」什麼呢&#xff1f; — 淺談大型語言模型的可解釋性&#xff08;24.05.03&#xff09;参考第11講&#xff1a;大型語言模型在「想」什麼呢&#xff1f; — 淺…...

hadoop+spark+hive基于大数据的食谱分析与个性化推荐系统 美食推荐系统 美食可视化 大数据毕业设计

前言随着互联网技术的快速发展&#xff0c;人们获取信息的方式发生了巨大变化。特别是在食品领域&#xff0c;用户渴望获得更加个性化的推荐服务。大数据分析技术的出现为满足这一需求提供了可能。并据此提供精准的食谱推荐&#xff0c;从而提升用户体验。系统架构设计本项目 采…...

YOLO12开源模型合规部署:离线环境+审计日志+模型版本固化方案

YOLO12开源模型合规部署&#xff1a;离线环境审计日志模型版本固化方案 1. 项目背景与核心价值 YOLO12作为Ultralytics在2025年推出的最新实时目标检测模型&#xff0c;在保持高速推理性能的同时显著提升了检测精度。其引入的注意力机制优化了特征提取网络&#xff0c;nano版…...