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

news2024/11/15 14:07:56

在这里插入图片描述

文章目录

  • 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、面试

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

在这里插入图片描述

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

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

相关文章

前端JS必用工具【js-tool-big-box】学习,获取数据的详细类型

之前我们习惯性的用typeof方法去判断数据类型&#xff0c;但慢慢的发现&#xff0c;typeof这个方法能力有限&#xff0c;基础的数据类型倒是还能判断&#xff0c;但是复杂一点&#xff0c;或者是null之类的假类型&#xff0c;就判断不出来了。 比如以下这些判断&#xff1a; …

【软件设计师】——5.数据库系统

目录 5.1 基本概念 5.2 三级模式两级映射 5.3 设计过程和数据模型 5.4 关系代数 5.5 完整性约束 5.6 规范化和反规范化 5.7 控制功能 5.8 SQL语言 5.9 数据库安全 5.10 数据备份 5.11 数据库故障与恢复 5.12 数据仓库、数据挖掘和大数据 5.1 基本概念 相关术语 候选…

hypack如何采集多波束数据?(下)

多波束测量模块 1&#xff09;记录多波束和辅助传感器的数据&#xff1b; 2&#xff09;显示实时改正后的数据和数据质量信息。 ​编辑​ 测量准备 1&#xff09;设置大地测量参数和硬件设置&#xff1b; 2&#xff09;计划测线 计划测线是一定间距的平行线&#xff0c;…

XPosed项目的接入、模版制作、改名全过程

XPosed项目的接入、模版制作、改名全过程 写在前面 之前写过这篇Xposed Hook 过登录密码验证配置开发Xposed项目的文章&#xff0c;这次的接入使用的是当前最新版Android Studio&#xff0c;接入稍微有些差别&#xff0c;也记录下。 本篇文章主要是写关于XP项目接入、制作XP模…

Oracle中rman的增量备份使用分享

继上次使用RMAN的全量备份和异机还原以后&#xff0c;开始研究一下增量备份和还原的方法。相比于全量RMAN的备份还原&#xff0c;增量的备份还原就相对简单。本实践教程直接上操作&#xff0c;还是回归到一个问题&#xff0c;就是关于两个数据库创建时候&#xff0c;必须保持or…

如何应对触摸一体机触摸屏失灵问题?怎么校准?

触摸一体机是一种功能强大的设备&#xff0c;集成了电脑、电视和触摸屏等多种功能。其中&#xff0c;触摸屏是其重要组成部分之一。然而&#xff0c;当触摸屏突然失灵时&#xff0c;我们该如何应对呢&#xff1f;以下是一些建议&#xff0c;以帮助您排除问题并重新获得正常触摸…

汇凯金业:如何识别黄金价格图表中的关键支撑和阻力位

识别黄金价格图表中的关键支撑和阻力位是黄金交易的一个基本而关键的技能。以下是一些方法来帮助投资者发现这些重要的价格水平&#xff1a; 1. 历史价格水平 观察图表&#xff0c;找出黄金价格在过去曾多次反弹或回落的价格点。这些水平在未来的交易中可能再次成为关键的支撑…

记一次 .NET某工控WPF程序被人恶搞的 卡死分析

一&#xff1a;背景 1. 讲故事 这一期程序故障除了做原理分析&#xff0c;还顺带吐槽一下&#xff0c;熟悉我的朋友都知道我分析dump是免费的&#xff0c;但免费不代表可以滥用我的宝贵时间&#xff0c;我不知道有些人故意恶搞卡死是想干嘛&#xff0c;不得而知&#xff0c;希…

【链表】Leetcode 61. 旋转链表【中等】

旋转链表 给你一个链表的头节点 head &#xff0c;旋转链表&#xff0c;将链表每个节点向右移动 k 个位置。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], k 2 输出&#xff1a;[4,5,1,2,3] 解题思路 要将链表每个节点向右移动 k 个位置&#xff1a; 计算链表…

抖店类目错放怎么办?怎么改类目?快速解决抖店类目错放问题

大家好&#xff0c;我是电商花花。 我们运营抖音小店的时候&#xff0c;都知道不要放错类目&#xff0c;也知道放错类目的后果&#xff0c;类目错放可能导致商品无法在正确的类目中展示&#xff0c;从而影响到商品的一个曝光率。 严重的话还被平台扣分&#xff0c;扣保证金&a…

【大学物理】期末复习笔记总结

1-6章&#xff08;第2版&#xff09;以下是鄙人期末复习时总结的笔记&#xff0c;希望可以帮到大家 第一章&#xff1a; 第二章&#xff1a; 第三章&#xff1a; 第四章&#xff1a; 第五章&#xff1a; 第六章&#xff1a;

安泰电子:高压功率放大器应用场合介绍

高压功率放大器是一种电子设备&#xff0c;用于将低电压信号放大到较高电压水平&#xff0c;以满足各种应用需求。它在多个领域中具有广泛的应用&#xff0c;包括科学研究、工业生产、通信技术以及医疗设备。下面安泰电子将介绍高压功率放大器的应用场合。 科学研究 高压功率放…

SpringBoot自动装配源码

自动装配&#xff1a; 实际上就是如何将Bean自动化装载到IOC容器中管理&#xff0c;Springboot 的自动装配时通过SPI 的方式来实现的 SPI&#xff1a;SpringBoot 定义的一套接口规范&#xff0c;这套规范规定&#xff1a;Springboot 在启动时会扫描外部引用 jar 包中的META-IN…

有一个3x4的矩阵,求矩阵中所有元素中的最大值。要求用函数处理

解此题的算法已在之前的文章中介绍&#xff0c;详见&#xff1a;https://mp.csdn.net/mp_blog/creation/editor/139181787 编写程序&#xff1a; 运行结果&#xff1a;

基于微信小程序+ JAVA后端实现的【医院挂号预约系统】 设计与实现 (内附设计LW + PPT+ 源码+ 演示视频 下载)

项目名称 项目名称&#xff1a; 《基于微信小程序的医院挂号预约系统设计与实现》 项目技术栈 该项目采用了以下核心技术栈&#xff1a; 后端框架/库&#xff1a; Java, SSM框架数据库&#xff1a; MySQL前端技术&#xff1a; 微信小程序, uni-app 项目展示 全文概括 本…

一文解析恢复删除的文件:分享10个电脑数据恢复软件

电脑文件误删除&#xff0c;不仅让我们感到焦虑&#xff0c;还可能丢失重要的数据。只要使用正确的数据恢复软件&#xff0c;有可能成功恢复被删除的文件。本文将分享10个电脑数据恢复软件。 1、嗨格式数据恢复大师 一款免费预览的数据恢复软件&#xff0c;可以帮助你恢复从硬…

Apifox 更新|编排模式、Markdown 编辑器升级、自动申请 SSL 证书、用户反馈问题优化

Apifox 新版本上线啦&#xff01; 看看本次版本更新主要涵盖的重点内容&#xff0c;有没有你所关注的功能特性&#xff1a; 自动化测试新增「编排模式」Markdown 编辑器全新升级返回响应直接预览 PDF 及视频自动申请 SSL 证书支持配置自定义域名的子目录流式接口支持筛选和清…

RocketMQ 主从复制原理深度解析

提到主从复制&#xff0c;我们可能立马会联想到 MySQL 的主从复制。 MySQL 主从复制是 MySQL 高可用机制之一&#xff0c;数据可以从数据库服务器主节点复制到一个或多个从节点。 这篇文章&#xff0c;我们聊聊 RocketMQ 的主从复制&#xff0c;希望你读完之后&#xff0c;能…

与苹果力杠?微软AI PC全面升级

KlipC报道&#xff1a;5月21日&#xff0c;在召开的Build开发者前瞻活动中&#xff0c;微软CEO称全面升级AI PC&#xff0c;将Copilot融入Windows 11系统&#xff0c;GPT-4o 模型加持。 微软称即将发布全新款Surface电脑&#xff0c;将采用其Copilot标准&#xff0c;以支持人工…

IND-ID-CPA 和 IND-ANON-ID-CPA Game

Src: https://eprint.iacr.org/2017/967.pdf