面试题:MySQL 优化篇

在这里插入图片描述

定位慢查询

在这里插入图片描述

💖 开源工具

  • 调试工具:Arthas(阿尔萨斯)
  • 运维工具:Prometheus(普罗米修斯)、Skywalking
    在这里插入图片描述
    在这里插入图片描述

💖 MySQL 慢查询日志

在这里插入图片描述

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

配置完毕之后,通过以下指令重新启动MySQL服务器进行测试,查看慢日志文件中记录的信息

/var/lib/mysql/localhost-slow.log

在这里插入图片描述

慢SQL分析

可以采用 EXPLAIN 或者 DESC 命令获取 MySQL 如何执行 SELECT 语句的信息
在这里插入图片描述
在这里插入图片描述

MySQL 存储引擎

💖 MySQL 体系结构

四层:连接层、服务层、引擎层、存储层。
在这里插入图片描述

💖 存储引擎类型

存储引擎就是存储数据、建立索引、更新查询数据等技术的实现方式。存储引擎是基于表的,而不是基于库的,所以存储引擎也可以称为 表类型

在这里插入图片描述
MEMORY:把数据存储在内存

💖 InnoDB

  • 介绍
    • 兼顾高可靠性和高性能的通用存储引擎,在MySQL5.5 之后,InnoDB 是 MySQL默认的存储引擎
  • 特点
    • DML 操作遵循ACID模型,支持事务
    • 行级锁
    • 支持外键 FOREIGN KEY 约束,保证数据的完整性和正确性
  • 文件
    • xxx.ibd:xxx代表的是表名,innoDB引擎的每张表都会对应这样一个表空间文件,存储该表的表结构(frm、sdi)、数据和索引
    • xxx.frm 存储表结构(MySQL8.0时,合并在表名.ibd中)

索引

索引(index)是帮助MySQL高效获取数据的数据结构,主要是用来提高数据检索的效率降低数据库的IO成本,同时通过索引列对数据进行排序,降低数据排序的成本,也能降低了CPU的消耗。

💖 底层数据结构

🐷 二叉搜索树
效率不稳定,最坏的情况是 O(n)
在这里插入图片描述
🐷 红黑树
解决了二叉搜索树不平衡的问题,但是当数据量过大时,树的层数会很多,查询效率较好但不是最优
在这里插入图片描述
🐷 B 树
B-Tree,B树是一种多叉路衡查找树,相对于二叉树,B树每个节点可以有多个分支,即多叉

以一颗最大度数(max-degree)为 5(5阶) 的b-tree为例,那这个B树每个节点最多存储 4个key

在这里插入图片描述

💛 B+ 树

B+Tree 是在 BTree 基础上的一种优化,使其更适合实现外存储索引结构,InnoDB 存储引擎就是用 B+Tree实现其索引结构

在这里插入图片描述
B+ 树 vs B树

  • B树所有节点都存储数据,B+树只在叶子节点存储数据
  • B+树的叶子节点是一个双向链表

B+ 树的优势

  • 磁盘读写代价低(只需在叶子节点那层进行磁盘IO,中间的查询过程节点无需操作)
  • 查询效率更加稳定(数据都存储在叶子节点)
  • 便于区间查询(叶子节点双向链表)

💖 索引分类

在这里插入图片描述

  • 聚簇索引
    主要是指数据与索引放到一块,B+树的叶子节点保存了整行数据,有且只有一个,一般情况下用主键作为聚簇索引的索引列

  • 非聚簇索引(二极索引)
    值的是数据与索引分开存储,B+树的叶子节点保存对应的主键,可以有多个,一般我们自己定义的索引都是非聚簇索引

💛 回表查询

回表:就是通过二级索引找到对应的主键值,然后再通过主键值找到聚集索引中所对应的整行数据

覆盖索引不需要回表查询

💖 覆盖索引

  • 覆盖索引是指 select查询 语句使用了索引,需要返回的列全部出现在索引中

    • 如果我们使用主键 id 查询,它会直接走聚簇索引查询,聚簇索引中包含所有数据,肯定是覆盖索引
    • 如果按照二级索引查询数据的时候,返回的列中没有创建索引,有可能会触发回表查询,尽量避免使用select *,尽量在返回的列中都包含添加索引的字段

💖 深度分页

超大分页一般是指在数据量比较大时,我们使用了 limit分页查询,并且需要对数据进行排序,这个时候效率就很低,我们可以采用覆盖索引子查询来解决

  • 先分页查询数据的 id字段,确定了id之后,再用子查询来过滤,只查询这个id列表中的数据就可以了

💖 索引创建原则

  • 数据量较大时,查询多 增删少的表(单表超 10 万数据,提高查询性能)
  • 针对常用作查询条件(where)、排序(order by)、分组(group by)操作的字段建立索引
  • 选择区分度高的列
  • 字符串类型:较长时,建立前缀索引
    • 前缀索引能有效减小索引文件的大小,让每个索引页可以保存更多的索引值,从而提高了索引查询的速度。但前缀索引也有它的缺点,不能在 order by 或者 group by 中触发前缀索引,也不能把它们用于覆盖索引
  • 尽量使用联合索引,可以更好地实现索引覆盖
  • 控制数量,越多的索引导致维护索引结构的代价也越大,反而降低增删改的效率
  • 索引列尽可能创建 非空(NOT NULL)列,方便优化器更好地选择要使用的索引。

💖 索引失效

  • 违反最左匹配原则
    • 相当于多级目录,不能跳过上一级目录直接查询下一级目录,比如字典按拼音查字,先查第一个 字母,才能在第一个字母的基础上 按第二个字母查
  • 使用了范围查询的列 右边的索引列失效(不可用)
  • 范围查询本身也不一定生效,优化器会计算符合条件的数据比例,视情况使用索引
  • 在索引列上使用函数、运算操作,失效
    • 字符串不加 引号,导致查询优化器进行类型转换使用了函数操作,失效
    • 原因:有操作,索引的条件就会有变动,变动之后就查不了,比如查字典查“ha”,h 变成了 其他字母,那就没法子查了
  • 以 % 开头的模糊查询,失效

SQL 优化

当然有索引一席之地,参考上文


💖 表设计优化

在这里插入图片描述

💖 SQL 语句优化

在这里插入图片描述

💖 主从复制 读写分离

在这里插入图片描述


其实还有个分库分表

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

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

相关文章

k8s入门到实战(七)—— 回顾:使用yaml文件配置pv、pvc、configmap部署mysql服务

实战:部署 mysql 服务 回顾加深 pv、pvc、configmap 删除所有 deployment、pv、pvc、configmap、StorageClass创建一个 nsf 挂载目录给 mysql mkdir -p /nfs/data/mysql创建 yaml 文件mysql-server.yaml # 创建pv apiVersion: v1 kind: PersistentVolume metadat…

黑马鸿蒙笔记 3

目录 11.ArkUI组件-Column和Row 12.ArkUI组件-循环控制 13.ArkUI组件-List 14.ArkUI组件-自定义组件 15.ArkUI组件-状态管理State装饰器 16.ArkUI组件-状态管理-任务统计案例 17.ArkUI组件-状态管理-PropLinkProvideConsume 11.ArkUI组件-Column和Row Colum和Row的交叉…

QT-飞机水平仪图标

QT-飞机水平仪图标 一、演示效果二、关键程序三、下载链接 一、演示效果 二、关键程序 #include <stdio.h> #include <stdlib.h> #include <string.h>#include <QtCore> #include <QtGui> #include <QDebug> #include <QTableWidget&g…

Oracle Solaris 11.3开工失败问题处理记录

1、故障现像 起初是我这有套RAC有点问题&#xff0c;我想重启1个节点&#xff0c;结果发现重启后该节点的IP能PING通&#xff0c;但SSH连不上去&#xff0c;对应的RAC服务也没有自动启动。 操作系统是solaris 11.3。由于该IP对应的主机是LDOM&#xff0c;于是我去主域上telnet…

【BlossomRPC】接入注册中心

文章目录 NacosZookeeper自研配置中心 RPC项目 配置中心项目 网关项目 这是BlossomRPC项目的最后一篇文章了&#xff0c;接入完毕注册中心&#xff0c;一个完整的RPC框架就设计完成了。 对于项目对注册中心的整合&#xff0c;其实我们只需要再服务启动的时候将ip/port/servic…

Qt6.6添加多媒体模块Multimedia报错问题

问题 QT包含多媒体模块Multimedia时提示未知的模块&#xff1a; error: Project ERROR: Unknown module(s) in QT: multimedia 在帮助文档中只可以找到QMediaPlayer类&#xff0c;但是点进去是空的&#xff0c;这是因为没有安装多媒体模块及对应的帮助文档。 解决 使用在线…

● 435. 无重叠区间 ● 763.划分字母区间 ● 56. 合并区间

● 435. 无重叠区间 class Solution:def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:if len(intervals)1:return 0intervalssorted(intervals,keylambda x:(x[0],x[1]))res0for i in range(1,len(intervals)):if intervals[i][0]<intervals[i-1][…

代码随想录算法训练营第41天|343. 整数拆分 |96.不同的二叉搜索树

代码随想录算法训练营第41天|343. 整数拆分 |96.不同的二叉搜索树 详细布置 今天两题都挺有难度&#xff0c;建议大家思考一下没思路&#xff0c;直接看题解&#xff0c;第一次做&#xff0c;硬想很难想出来。 343. 整数拆分 https://programmercarl.com/0343.%E6%95%B4%E6%…

【Go】十三、面向对象:方法

文章目录 1、面向对象2、结构体实例的创建3、结构体之间的转换4、方法5、结构体值拷贝6、方法的注意点7、方法和函数的区别8、跨包创建结构体实例 1、面向对象 Go的结构体struct ⇒ Java的Class类Go基于struct来实现OOP相比Java&#xff0c;Go去掉了方法重载、构造函数和析构函…

css- 4

1.浮动 1. 浮动最初用于实现文字环绕效果 2. 现在&#xff0c;浮动是主流的布局方式之一 1.1元素浮动之后的特点 元素浮动之后&#xff0c;称为浮动元素&#xff0c;具有如下特点&#xff1a; 1. 浮动元素脱离文档流 2. 多个浮动的元素会水平排列&#xff0c;一行放不下自动换…

Redis高级面试题-2024

说说你对Redis的理解 Redis是一个基于Key-Value存储结构的开源内存数据库&#xff0c;也是一种NoSQL数据库。 它支持多种数据类型&#xff0c;包括String、Map、Set、ZSet和List&#xff0c;以满足不同应用场景的需求。 Redis以内存存储和优化的数据结构为基础&#xff0c;提…

chatglm.cpp编译与执行

ChatGLM3介绍 ChatGLM3是由智谱AI和清华大学KEG实验室联合发布的对话预训练模型。作为第三代大型语言模型&#xff0c;ChatGLM3不仅理解和生成人类语言&#xff0c;还能执行代码、调用工具&#xff0c;并以markdown格式进行响应。其目标是打造更智能、更安全的代码解释器和工具…

【力扣一刷】代码随想录day27(39. 组合总和、40.组合总和II、131.分割回文串)

目录 【39. 组合总和】中等题 【40.组合总和II】中等题 【131. 分割回文串】中等题 【39. 组合总和】中等题 思路&#xff1a; 确定终止条件&#xff1a;sum target时记录路径并返回。剪枝&#xff1a;当前节点的路径之和已经大于sum就不可能再等于sum了&#xff0c;结束该分支…

16进制的字符串转byte[]数组 以及将字节数组转换成十六进制的字符串

16进制的字符串转byte[]数组 public class ClientString16 {@Testpublic void get16Str(){String str="48 47 12 00 14 12 16 08 15 0d 30 0f 02 30 30 30 30 30 30 30 30 30 30 00 c2";byte[] bytes = hexStringToByteArray(str);getBytetoString(bytes);//String …

【御控物联】JavaScript JSON结构转换(12):对象To数组——键值互换属性重组

文章目录 一、JSON结构转换是什么&#xff1f;二、核心构件之转换映射三、案例之《JSON对象 To JSON数组》四、代码实现五、在线转换工具六、技术资料 一、JSON结构转换是什么&#xff1f; JSON结构转换指的是将一个JSON对象或JSON数组按照一定规则进行重组、筛选、映射或转换…

【御控物联】JavaScript JSON结构转换(8):数组To数组——多层属性重组

文章目录 一、JSON结构转换是什么&#xff1f;二、案例之《JSON数组 To JSON数组》三、代码实现四、在线转换工具五、技术资料 一、JSON结构转换是什么&#xff1f; JSON结构转换指的是将一个JSON对象或JSON数组按照一定规则进行重组、筛选、映射或转换&#xff0c;生成新的JS…

Java

1.学生和老师都会有work方法&#xff0c;学生的工作是学习&#xff0c;老师的工作是教书&#xff0c;我利用了一个接口来实现&#xff1b; 2.同时&#xff0c;老师和学生都是人&#xff0c;并且都有姓名&#xff0c;姓名&#xff0c;年龄和身高等特征&#xff0c;我用了一个继承…

http协议补充

7.7实现http请求 class httprequest { public:void Deserialize(std::string content){while (true){auto pos content.find(sep);if (pos std::string::npos){break;}std::string temp content.substr(0, pos);if (temp.empty()){break;}req_header_.push_back(temp);cont…

轮播卡片切换实现

背景 如上图&#xff0c;实现一个轮播卡片能力&#xff0c;支持手动滑动&#xff0c;手动拖动&#xff0c;已经点击两端切换按钮。 实现 <template><div class"top-menu"><!-- Swiper --><div v-if"headerMenuList.length > 9" c…