在一次又一次的失败中, 我总结了这份万字的《MySQL 性能调优笔记》

news2025/1/11 10:21:26

MySQL 性能调优学习导图》概要

 

说明:本文篇幅有限,故只展示部分内容,《MySQL 性能调优学习导图》资料已整理成文档,需要获取的小伙伴可以直接转发+关注后私信(学习)即可获取哦

一、性能监控

1. 使用 show profile 查询剖析工具,可以指定具体的 type

此工具默认是禁用的,可以通过服务器变量在绘画级别动态的修改

set profiling=1;

当设置完成之后,在服务器上执行的所有语句,都会测量其耗费的时间和其他一些查询执行状态变更相关的数据。

select * from emp;

在 mysql 的命令行模式下只能显示两位小数的时间,可以使用如下命令查看具体的执行时间

show profiles;

执行如下命令可以查看详细的每个步骤的时间:

show profile for query 1;

2. 使用 performance schema 来更加容易的监控 mysql

MYSQL performance schema 详解

  • performance_schema 的介绍

  • performance schema 入门

  • performance_schema 表的分类

  • performance_schema 的简单配置与使用

  • 常用配置项的参数说明

  • 重要配置表的相关说明

  • performance_schema 实践操作

3. 使用 show processlist 查看连接的线程个数,来观察是否有大量线程处于不正常的状态或者其他不正常的特征

  • id 表示 session id

  • user 表示操作的用户

  • host 表示操作的主机

  • db 表示操作的数据库

  • command 表示当前状态

  • info 表示详细的 sq1 语向

  • time 表示相应命令执行时间

  • state 表示命令执行状态

二、schema 与数据类型优化

1. 数据类型的优化

更小的通常更好:应该尽量使用可以正确存储数据的最小数据类型,更小的数据类型通常更快,因为它们占用更少的磁盘、内存和 CPU 缓存,并且处理时需要的 CPU 周期更少,但是要确保没有低估需要存储的值的范围,如果无法确认哪个数据类型,就选择你认为不会超过范围的最小类型

简单就好:简单数据类型的操作通常需要更少的 CPU 周期,例如,①、整型比字符操作代价更低,因为字符集和校对规则是字符比较比整型比较更复杂;②、使用 mysql 自建类型而不是字符串来存储日期和时间;③、用整型存储 IP 地址

尽量避免 null:如果查询中包含可为 NULL 的列,对 mysql 来说很难优化,因为可为 null 的列使得索引、索引统计和值比较都更加复杂,坦白来说,通常情况下 null 的列改为 not null 带来的性能提升比较小,所有没有必要将所有的表的 schema 进行修改,但是应该尽量避免设计成可为 null 的列

实际细则:

2. 合理使用范式和反范式

①、范式

优点:

  • 范式化的更新通常比反范式要快

  • 当数据较好的范式化后,很少或者没有重复的数据

  • 范式化的数据比较小,可以放在内存中,操作比较快

缺点:

  • 通常需要进行关联

②、反范式

优点

  • 所有的数据都在同一张表中,可以避免关联

  • 可以设计有效的索引;

缺点

  • 表格内的冗余较多,删除数据时候会造成表有些有用的信息丢失

③、注意

3. 主键的选择

代理主键:与业务无关的,无意义的数字序列

自然主键:事物属性中的自然唯一标识

推荐使用代理主键

  • 它们不与业务耦合,因此更容易维护

  • 一个大多数表,最好是全部表,通用的键策略能够减少需要编写的源码数量,减少系统的总体拥有成本

4. 存储引擎的选择

5. 适当的数据冗余

  • 被频繁引用且只能通过 Join 2 张(或者更多)大表的方式才能得到的独立小字段。

  • 这样的场景由于每次 Join 仅仅只是为了取得某个小字段的值,Join 到的记录又大,会造成大量不必要的 IO,完全可以通过空间换取时间的方式来优化。不过,冗余的同时需要确保数据的一致性不会遭到破坏,确保更新的同时冗余字段也被更新。

6. 适当拆分

当我们的表中存在类似于 TEXT 或者是很大的 VARCHAR 类型的大字段的时候,如果我们大部分访问这张表的时候都不需要这个字段,我们就该义无反顾的将其拆分到另外的独立表中,以减少常用数据所占用的存储空间。这样做的一个明显好处就是每个数据块中可以存储的数据条数可以大大增加,既减少物理 IO 次数,也能大大提高内存中的缓存命中率。

三、执行计划

四、通过索引进行优化

1. 索引基本知识

  • 索引的优点

  • 索引的用处

  • 索引的分类

  • 面试技术名词

  • 索引采用的数据结构

  • 索引匹配方式

2. 哈希索引

  • 基于哈希表的实现,只有精确匹配索引所有列的查询才有效

  • 在 mysql 中,只有 memory 的存储引擎显式支持哈希索引

  • 哈希索引自身只需存储对应的 hash 值,所以索引的结构十分紧凑,这让哈希索引查找的速度非常快

  • 自由主题

3. 组合索引

当包含多个列作为索引,需要注意的是正确的顺序依赖于该索引的查询,同时需要考虑如何更好的满足排序和分组的需要

4. 聚簇索引与非聚簇索引

  • 聚簇索引:不是单独的索引类型,而是一种数据存储方式,指的是数据行跟相邻的键值紧凑的存储在一起

  • 非聚簇索引:数据文件跟索引文件分开存放

5. 覆盖索引

  • 基本介绍

  • 优势

6. 优化小细节

  • 当使用索引列进行查询的时候尽量不要使用表达式,把计算放到业务层而不是数据库层

  • 尽量使用主键查询,而不是其他索引,因此主键查询不会触发回表查询

  • 使用前缀索引

  • 使用索引扫描来排序

  • union all,in,or 都能够使用索引,但是推荐使用 in

  • 范围列可以用到索引

  • 强制类型转换会全表扫描

  • 更新十分频繁,数据区分度不高的字段上不宜建立索引

  • 创建索引的列,不允许为 null,可能会得到不符合预期的结果

  • 当需要进行表连接的时候,最好不要超过三张表,因为需要 join 的字段,数据类型必须一致

  • 能使用 limit 的时候尽量使用 limit

  • 单表索引建议控制在 5 个以内

  • 单索引字段数不允许超过 5 个(组合索引)

  • 创建索引的时候应该避免以下错误概念

7. 索引监控

五、查询优化

1. 查询慢的原因

  • 网络

  • CPU

  • IO

  • 上下文切换

  • 系统调用

  • 生成统计信息

  • 锁等待时间

2. 优化数据访问

查询性能低下的主要原因是访问的数据太多,某些查询不可避免的需要筛选大量的数据,我们可以通过减少访问数据量的方式进行优化

是否向数据库请求了不需要的数据

  • 查询不需要的记录

  • 多表关联时返回全部列

  • 总是取出全部列

  • 重复查询相同的数据

3. 执行过程的优化

查询缓存:在解析一个查询语句之前,如果查询缓存是打开的,那么 mysql 会优先检查这个查询是否命中查询缓存中的数据,如果查询恰好命中了查询缓存,那么会在返回结果之前会检查用户权限,如果权限没有问题,那么 mysql 会跳过所有的阶段,就直接从缓存中拿到结果并返回给客户端

查询优化处理:mysql 查询完缓存之后会经过以下几个步骤:解析 SQL、预处理、优化 SQL 执行计划,这几个步骤出现任何的错误,都可能会终止查询

4. 优化特定类型的查询

  • 优化 count()查询

  • 优化关联查询

  • 优化子查询

  • 优化 limit 分页

  • 优化 union 查询

  • 推荐使用用户自定义变量

六、分区表

1. 分区表的应用场景

  • 表非常大以至于无法全部都放在内存中,或者只在表的最后部分有热点数据,其他均是历史数据

  • 分区表的数据更容易维护

  • 分区表的数据可以分布在不同的物理设备上,从而高效地利用多个硬件设备

  • 可以使用分区表来避免某些特殊的瓶颈

  • 可以备份和恢复独立的分区

2. 分区表的限制

  • 一个表最多只能有 1024 个分区,在 5.7 版本的时候可以支持 8196 个分区

  • 在早期的 mysql 中,分区表达式必须是整数或者是返回整数的表达式,在 mysql5.5 中,某些场景可以直接使用列来进行分区

  • 如果分区字段中有主键或者唯一索引的列,那么所有主键列和唯一索引列都必须包含进来

  • 分区表无法使用外键约束

3. 分区表的原理

4. 分区表的类型

  • 范围分区

  • 列表分区

  • 列分区

  • hash 分区

  • key 分区

  • 子分区

5. 如何使用分区表

如果需要从非常大的表中查询出某一段时间的记录,而这张表中包含很多年的历史数据,数据是按照时间排序的,此时应该如何查询数据呢?

因为数据量巨大,肯定不能在每次查询的时候都扫描全表。考虑到索引在空间和维护上的消耗,也不希望使用索引,即使使用索引,会发现会产生大量的碎片,还会产生大量的随机 IO,但是当数据量超大的时候,索引也就无法起作用了,此时可以考虑使用分区来进行解决

6. 在使用分区表的时候需要注意的问题

  • nul1 值会使分区过滤无效

  • 分区列和索引列不匹配,会导致查询无法进行分区过滤

  • 选择分区的成本可能很高

  • 打开并锁住所有底层表的成本可能很高

  • 维护分区的成本可能很高

七、服务器参数设置

1. general

2. character

3. connection

4. log

5. cache

6. INNODB

学习感言

成功不是将来才有的,而是从决定去做的那一刻起,持续累积而成。

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

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

相关文章

2022/12/1 结构体

结构体 声明结构体: struct 结构体名 例如:struct student 其中,student又称为结构体标记 结构体可以拥有成员,例如: struct student { int num; int score; char name[20] }; 注意,分号不可以少…

万应低代码11月重点更新内容速递

速览版 详情版 低代码开发效率升级 1.页面变量支持快速构建 在「数据提交」、「调用逻辑」等存在数据返回的节点中,支持根据其输出的内容去自动创建数据类型相同的变量,并自动建立好映射关系。 ● 【功能上线前】: 需要为每一个输出字…

Elasticsearch_第一章_ elasticsearch基础

Elasticsearch_第一章_ elasticsearch基础 – elasticsearch基础 文章目录Elasticsearch_第一章_ elasticsearch基础0.学习目标1.初识elasticsearch1.1.了解ES1.1.1.elasticsearch的作用1.1.2.ELK技术栈1.1.3.elasticsearch和lucene1.1.4.为什么不是其他搜索技术?1…

企业该如何选择自己合适的云财务软件?

据相关数据统计,2021年,我国云服务市场规模达274亿美元(超1700亿元人民币),预计到2026年将增长至850亿美元(约5400亿元人民币)。可见,云服务市场的发展之迅。对于企业而言&#xff0…

python入门项目03:完成黑心资本家发工资的程序

本题来源于黑马程序员b站视频&#xff0c;如有侵权&#xff0c;请联系删除。 import random #总金额10000 all_money10000 n0#记录发放工资的人 #发工资 for i in range(1,21):#20个员工jixiaorandom.randint(1,10)#生成一个1&#xff0c;10的随机数if jixiao<5:print(f员工…

12.1排序

目录 0.修改栈堆内存 一.堆排序 1 原理 2.代码实现 3.分析 二.冒泡排序 1 原理 2.实现 3.分析 三.快速排序(重要) 1 原理-总览 2.方法:挖坑法 步骤一 步骤二 步骤三 步骤四 步骤五 步骤六 3.代码实现挖坑法 4.分析 四.字符串转整数 1.字符串方法 2.字符…

【C++重点语法下】可变参数模板,STL里面的push_back和emplace_back区别 ,包装器function,bind

目录 1.可变参数模板 1.1取出参数包内的参数方法一&#xff1a; 1.2取出参数包内的参数方法二&#xff1a; 1.3STL里面的push_back和emplace_back区别 2.包装器function 2.1function&#xff08;头文件functional&#xff09; 2.1.1可调用类型和包装器 2.1.2类的成员函数…

实验十 符号计算基础与符号微积分(matlab)

目录 实验十 符号计算基础与符号微积分 1.1实验目的 1.3流程图 1.4程序清单 1.5运行结果及分析 1.6实验的收获与体会 1.1实验目的 1.2实验内容 符号计算基础与符号微积分 课本第372页 1.3流程图 1.4程序清单 实验十 1 clear xsym(6); ysym(5); z(1x)/(sqrt(…

第9章 登录页面的跳转实现

1 “swg-login.html”登录按钮不能触发异常 由于.Net框架默认支持“HTTPS”协议从而导致“swg-login.html”登录按钮不能触发&#xff0c;其异常信息如下&#xff1a;“Mixed Content: The page at https://localhost:7037/swg-login.html was loaded over HTTPS, but requeste…

FinalShell软件连接成功后,root文件夹显示一直加载中....

出现这样的问题就是因为我们一开始进入的用户是普通用户&#xff0c;然后你就会想着使用su命令转为超级用户&#xff0c;但是这样式不可行的&#xff0c;因为虚拟机会默认你第一次进入的用户是当前用户&#xff0c;还是解决不了问题。 解决办法&#xff1a; 再开一个连接进入…

java基于springboot_vue的校园闲置物品交易系统-计算机毕业设计

开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven 本文从管理员、用户的功能要求…

Java(八)----多线程(二)

1. 生产者与消费者 1.1 安全问题产生 线程本身就是一个新创建的方法栈内存 (CPU进来读取数据) 线程的notify(),唤醒第一个等待的线程 解决办法 : 全部唤醒 notifyAll() 被唤醒线程,已经进行过if判断,一旦醒来继续执行 线程被唤醒后,不能立刻就执行,再次判断标志位,利用循环 …

[附源码]Python计算机毕业设计Django基于Vue的社区拼购商城

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

Python学习日记-第三十八天-生成器

系列文章目录 生成器创建生成器的方法生成器-使用send方式唤醒使用yield完成多任务一、生成器 利用迭代器&#xff0c;我们可以在每次迭代获取数据&#xff08;通过next方法&#xff09;时按照特定的规律进行生成&#xff0c;但是我们在实现一个迭代器时&#xff0c;关于当前…

Pr:导出设置之基本视频设置

视频 VIDEO设置因所选导出格式而异。每种格式都有独特的要求&#xff0c;这些要求决定了哪些设置可用。以导出文件格式为 H.264 为例&#xff0c;下面给出有关基本视频设置 Basic Video Settings的选项及说明。匹配源Match Souce自动设定视频设置选项以匹配源视频的属性。支持匹…

项目一共30个模块,你叫我maven版本一个个手动改?

之前有个群友私聊问我&#xff0c;如何快速统一去更改项目中所有的maven版本号&#xff0c;他说之前都是手动一个个去修改&#xff0c;项目一共有30多个maven模块&#xff0c;上次因为漏改了一个&#xff0c;还造成了生产事故。 其实我自己开源项目有的工程也非常多&#xff0…

Java入门必备知识你能掌握多少?

1、Java是一种高级计算机语言&#xff0c;是可以编写跨平台应用软件、完全面向对象的程序设计语言。 2、Java划分为三个技术平台&#xff1a;Java SE、Java EE、Java ME Java SE是桌面应用&#xff0c;Java EE是web应用&#xff0c;平台企业版&#xff0c;Java ME是手机应用&…

亚马逊鲲鹏系统批量注册功能可以让你快速拥有大量亚马逊买家号

亚马逊鲲鹏系统是一款能批量注册买家号、AI智能一键养号、模拟真人行为轨迹进行刷单测评的软件&#xff0c;而对于批量注册买家号&#xff0c;操作也是比较简单的。 主要流程是购买了相应的账号所需资料后&#xff0c;通过批量导入邮箱、邮箱密码、信用卡、收货地址进入软件然后…

嵌入式分享合集114

一、DMA DMA&#xff0c;全称Direct Memory Access&#xff0c;即直接存储器访问。 DMA传输将数据从一个地址空间复制到另一个地址空间&#xff0c;提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。 我们知道CPU有转移数据、计算、控制程序转移等很多功能&…

拿到8000元的火焰杯比赛奖金,感谢霍格沃兹测试开发学社

下面是我们获奖学员自己主动分享的 然后发给霍格沃兹测试开发学社表示感谢的&#xff0c;收到她的反馈我们也由衷的开心。所以也分享给大家&#xff0c;目前无论是应届生 在校生还是从业人员&#xff0c;都可以加入第三届火焰杯比赛&#xff0c;赢取属于专属于自己的荣耀。 我…