面试题:MySQL 优化篇

news2024/11/25 7:39:46

在这里插入图片描述

定位慢查询

在这里插入图片描述

💖 开源工具

  • 调试工具: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.coloradmin.cn/o/1561632.html

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

相关文章

HWOD:整型数组排序

一、知识点 while(1){}表示永久循环 使用break结束循环 二、题目 1、描述 输入整型数组和排序标识&#xff0c;对其元素按照升序或降序进行排序 2、数据范围 1<n<1000 0<val<100000 3、输入 第一行输入数组元素个数 第二行输入待排序的数组&#x…

安装JupyterLab的集成环境

Python集成环境安装 不要半途而废&#xff0c;不要作业太多就抛下你手中的笔&#xff0c;拿起你旁边的手机&#xff0c;你觉得这样很有意义吗&#xff1f;一个小时一道题都没做&#xff0c;盯着手机屏幕它能给你一个未来吗&#xff1f;少分心就能多做一道题&#xff0c;多学样本…

编程新手必看,Python开发环境工具揭秘:高效编程的必备工具(2)

1、Python主流的开发工具介绍&#xff1a; Python的主流开发工具主要包括PyCharm、Visual Studio Code&#xff08;VS Code&#xff09;、IDLE等。具体介绍如下&#xff1a; 1.1、PyCharm&#xff1a; PyCharm是由JetBrains开发的&#xff0c;专为Python设计的IDE&#xff0…

生成 SSH 公钥

Windows 用户建议使用 Windows PowerShell 或者 Git Bash&#xff0c;在 命令提示符 下无 cat 和 ls 命令。 1、通过命令 ssh-keygen 生成 SSH Key&#xff1a; ssh-keygen -t ed25519 -C "Gitee SSH Key"-t key 类型 -C 注释 输出&#xff0c;如&#xff1a; 中间…

【tensorflow框架神经网络实现鸢尾花分类_Keras】

文章目录 1、前言2、鸢尾花分类3、结果打印 1、前言 【tensorflow框架神经网络实现鸢尾花分类】一文中使用自定义的方式&#xff0c;实现了鸢尾花数据集的分类工作。在这里使用tensorflow中的keras模块快速、极简实现鸢尾花分类任务。 2、鸢尾花分类 import tensorflow as t…

python如何画奥运五环

绘制奥运五环主要涉及到Python中的turtle绘图库运用&#xff1a; 程序源代码为&#xff1a; import turtle turtle.width(10) turtle.color(black) turtle.circle(50) turtle.penup() turtle.goto(120,0) turtle.pendown() turtle.color(red) turtle.circle(50) turtle.penup()…

KT-0850——三箱社交箱

动物行为学是一门跨学科的科学&#xff0c;致力于研究动物的行为模式、决策过程以及它们如何在不同的环境中进行社交互动。在探索动物王国的奥秘时&#xff0c;科学家们发展出了多种实验方法&#xff0c;其中三箱社交实验是一种被广泛采用的技术&#xff0c;用于揭示动物在社交…

力扣热题100_链表_141_环形链表

文章目录 题目链接解题思路解题代码 题目链接 141. 环形链表 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统…

从C到C++:深入理解基础语法差别

C基础语法讲解 前言1.输入输出2.命名空间2.1命名空间的理解&#xff1a;2.2命名空间的使用方式 3.缺省参数3.1概念&#xff1a;3.2分类&#xff1a;半缺省函数注意事项&#xff1a; 3.3使用案例&#xff1a;顺序表的初始化 4.函数重载4.1参数重载类型类型&#xff1a; 5.引用5.…

企业员工在线培训系统功能介绍

随着信息技术的飞速发展&#xff0c;企业员工培训方式正逐步从传统的面授转向灵活高效的在线培训。一个综合性的企业员工在线培训系统能够为员工提供多样化的学习资源、便捷的学习途径和有效的学习监督&#xff0c;以下是该系统的主要功能详细介绍&#xff1a; 1. 课程功能 线…

API接口对接全攻略:从入门到精通

在数字化时代&#xff0c;API&#xff08;应用程序接口&#xff09;已经成为了不同软件系统间信息交互的桥梁。对于开发者而言&#xff0c;掌握API接口的对接技术&#xff0c;无疑是通往更高效、更智能的软件开发之路的钥匙。本文将为大家提供一份从入门到精通的API接口对接全攻…

C++语言·入门

现在我们讲完了数据结构初阶部分的内容&#xff0c;数据结构剩下的内容会在C语言讲解的差不多的时候加入。 1. 什么是C C语言是结构化模块化的语言&#xff0c;适合处理较小规模的程序。对于复杂的问题&#xff0c;规模较大的程序&#xff0c;需要高度抽象和建模时&#xff0c…

CorePoolExecutor夺命连环问?看你可以接受几招?

一、前言 今天我在看why技术的时候&#xff0c;看到了这个。发现这个没有全部的八股回答&#xff1f;于是我就结合自己的经验&#xff0c;分享下八股 二、八股问答 2.1了解JDK Executors线程池吗? Executor就是一个线程池框架&#xff0c;在开发中如果需要创建线程可优先考…

期权的常见结构

期权收益图 期权的**收益&#xff08;payoff&#xff09;**是指期权到期日时的价值&#xff0c;**期权的损益&#xff08;profit&#xff09;**不但包含期权的收益&#xff0c;还包括期权交易开始时发生的期权费。 买入看涨期权 看涨期权买入方&#xff0c;当到期时标的资产…

【讲解下NLP学习路线的总结】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

嵌入式网络硬件方案

一. 简介 本文来了解一下嵌入式有些网络中&#xff0c;涉及的网络硬件方案。 注意&#xff1a;本文说明的是有些网络。 提起网络&#xff0c;我们一般想到的硬件就是“网卡”&#xff0c;“网卡”这个概念最早从电脑领域传出来&#xff0c;顾名思义就是能上网的卡。在电脑领…

牛客2024年愚人节比赛(A-K)

比赛链接 毕竟是娱乐场&#xff0c;放平心态打吧。。。 只有A一个考了数学期望&#xff0c;其他的基本都是acmer特有的脑筋急转弯&#xff0c;看个乐呵即可。 A 我是欧皇&#xff0c;赚到盆满钵满&#xff01; 思路&#xff1a; 我们有 p 1 p_1 p1​ 的概率直接拿到一件实…

redis基础数据结构

文章目录 前言字符串常见命令内部编码使用场景1、缓存&#xff08;Cache&#xff09;功能2、计数3、共享Session4、限速 哈希命令内部编码使用场景存储结构化数据 列表命令内部编码使用场景1.阻塞消息队列模型2.文章列表3.微博 Timeline 集合命令内部编码使用场景1.给用户增加标…

图像处理环境配置opencv-python

下载python&#xff0c;配置pip使用清华源下载镜像&#xff1a; pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple 切换到python目录下&#xff0c;右击cmd&#xff0c;执行pip升级指令: python -m pip install --upgrade pip 下载opencv&#x…

Linux(CentOS7) 安装 Nginx

目录 下载 上传 解压 生成 Makefile 编译与安装 启动 nginx 创建软链接 常用命令 下载 官网地址&#xff1a; nginx: downloadhttps://nginx.org/en/download.html选择稳定版本&#xff0c;也可以指定需要的版本下载 上传 将下载好的 tar 包上传到 Linux 服务器…