MySQL性能优化(四)性能优化总结

文章目录

  • 连接优化
    • 服务端链接优化
    • 客户端连接优化
  • 配置的优化
  • 架构优化
    • 数据库高可用:
  • 数据库慢查询
    • 慢查询日志
    • profiling工具
  • 表结构和存储引擎的优化
    • 存储引擎:
    • 表结构
  • SQL与索引的优化
    • 案例- 执行计划 Explain
      • ID序号
      • select type查询类型
      • `type 针对单表的访问方法`
        • System
        • Const
        • eq_ref 唯一索引查询
        • ref 非唯一索引查询
        • range 索引范围查询
        • index (full index scan)
        • ALL(full table scan)全表扫描
      • `possible_keys、key`
      • key_len 使用的索引长度
      • ref筛选数据的参考
      • rows预计扫描行数
      • filtered 过滤百分比
      • `Extra 额外的信息`
        • using index 覆盖索引
        • using where
        • using index Conditon (默认开启)
        • using filesort 不能直接使用索引排序
        • using temporary 使用临时表
    • 优化案例
  • 业务优化
  • 数据库服务端状态
  • 附:

MySQL数据库优化的层次和思路
MySQL数据库优化的工具

在这里插入图片描述

连接优化

服务端链接优化

  1. 服务端高并发,连接数不够可以调大连接数。
show variables like 'max_connections'
-- max_connections	151
  1. 适当调小链接超时时间

客户端连接优化

  1. 使用数据库连接池技术。MyBatis自带的连接池、Durid、Hikari。
    连接池数量计算公式:connections = ((cpu_core_count * 2) + effective_spindle_count)。不宜配置过多,原因是CPU上下文切换需要消耗时间。

配置的优化

  1. 数据库配置
    参考官方文档:https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html
  2. 操作系统配置:磁盘阵列等。

架构优化

  1. 缓存(Redis)
  2. 数据库集群:复制技术https://dev.mysql.com/doc/refman/5.7/en/replication.html
    在这里插入图片描述
    • 多数据源(读写分离):mycat、AbstractRoutingDataSource、ShardingJDBC
    • 问题:同步延迟(主库并发、从库单线程导致)。解决方案1:可以采用全同步复制,但是会造成Master节点性能下降。MySQL默认是异步复制(对于Master节点来说,只要事务写入binlog提交了就会返回给客户端,并不会关心从库是否同步成功)。
    • 解决同步延迟更优的方案2:半同步复制。并不是等待所有的从库都写入成功才返回,而是只要有一个从库写入relay log就返回。但是启用半同步复制需要在主从节点安装对应插件。semisync_master.so、semisync_slave.so。
    install plugin rpl_semi_sync_master soname 'semisync_master.so';
    
    show variables like '%semi_sync%'
    -- 默认关闭,需要手动开启 
    
    • 解决同步延迟方案3:基于GTID(Global Transaction ID)复制。https://dev.mysql.com/doc/refman/5.7/en/replication-gtids.html
    show variables like '%gtid_mode%'
    -- gtid_mode	OFF
    -- 默认关闭需要手动开启
    

在这里插入图片描述
3. 分表:垂直分表、水平分表
4. 分库:垂直分库、水平分库

数据库高可用:

  1. 主从:HaProxy + Keepalived
  2. NDB cluster:https://dev.mysql.com/doc/refman/5.7/en/mysql-cluster-overview.html
  3. Galera Cluster For MySQL
  4. MHA:(Master-Master Replication Manager For MySQL) -> MMM:(MySQL Master High Available)
  5. MRG:(MySQL Group Replication)

数据库慢查询

慢查询日志

开启慢查询日志会消耗性能

-- 慢查询配置
show variables like 'slow_query%';
-- 多长时间的查询才叫慢查询
show variables like 'long_query%';

mysql慢日志分析工具

mysqldumpslow --help
whereis mysqldumpslow

profiling工具

https://dev.mysql.com/doc/refman/5.7/en/show-profile.html

select @@profiling;
set @@profiling=1; 

表结构和存储引擎的优化

存储引擎:

表结构

如果能确定长度,就不要定义定长的字段,给默认值也不要允许空值。
存非文本字段,应该存储地址。而不是存储编码。仅量和业务表做拆分。
对于字段很多的表,对字段进行拆分。
也可以利用字段冗余来避免join,提升查询性能。

历史表:增长速度快。按照时间维度区分。按年月划分为12个区。

SQL与索引的优化

案例- 执行计划 Explain

更详细的explain:format=JSON

explain format=JSON select t.tname from teacher t group by tname;

https://dev.mysql.com/doc/refman/5.7/en/explain-output.html
在这里插入图片描述


drop table if exists course;
create table course(
    id int(3) default null,
    cname varchar(20) default null,
    tid int(3) default null
) engine = InnoDB default charset = utf8mb4;

drop table if exists teacher;
create table teacher(
    tid int(3) default null,
    tname varchar(20) default null,
    tcid int(3) default null
) engine = InnoDB default charset = utf8mb4;

drop table if exists teacher_contact;
create table teacher_contact(
    tcid int(3) default null,
    phone varchar(20) default null
) engine = InnoDB default charset = utf8mb4;

insert into course values(1,'java','1');
insert into course values(2,'jvm','1');
insert into course values(3,'mysql','2');
insert into course values(4,'c#','2');

insert into teacher values(1,'whx',1);
insert into teacher values(2,'huathy',2);

insert into teacher_contact values(1,'QQ12341234');
insert into teacher_contact values(2,'TEL123123123');

ID序号

explain  select * from teacher_contact tc where tcid = (
    select t.tcid from teacher t where t.tid = (
        select c.tid from course c where c.cname = 'jvm'
    )
)
# 查询顺序从大到小
id|select_type|table|partitions|type|possible_keys|key|key_len|ref|rows|filtered|Extra      |
--+-----------+-----+----------+----+-------------+---+-------+---+----+--------+-----------+
 1|PRIMARY    |tc   |          |ALL |             |   |       |   |   2|    50.0|Using where|
 2|SUBQUERY   |t    |          |ALL |             |   |       |   |   2|    50.0|Using where|
 3|SUBQUERY   |c    |          |ALL |             |   |       |   |   4|    25.0|Using where|

explain select * from teacher t 
left join teacher_contact tc on t.tcid = tc.tcid 
left join course c on t.tid = c.tid 
where c.id = 2 or tc.tcid = 3;
# id相同,则从上到下依次访问
id|select_type|table|partitions|type|possible_keys|key|key_len|ref|rows|filtered|Extra                                             |
--+-----------+-----+----------+----+-------------+---+-------+---+----+--------+--------------------------------------------------+
 1|SIMPLE     |t    |          |ALL |             |   |       |   |   2|   100.0|                                                  |
 1|SIMPLE     |tc   |          |ALL |             |   |       |   |   2|   100.0|Using where; Using join buffer (Block Nested Loop)|
 1|SIMPLE     |c    |          |ALL |             |   |       |   |   4|   100.0|Using where; Using join buffer (Block Nested Loop)|

小表驱动大表:关联查询会产生临时表,应优先查询表数据少的表。

select type查询类型

  • SIMPLE 简单查询
  • PRIMARY 主查询
  • SUBQUERY 子查询
  • DERIVED 临时表
  • UNION 链接查询
  • UNION RESULT 链接结果
explain select t.* from (
    select * from teacher where tid =1
    union
    select * from teacher where tid =2
) t

在这里插入图片描述

type 针对单表的访问方法

链接类型:从左到右,性能越来越差
system > const > eq_ref > ref > range > index > ALL

System

在Memory或MyISAM存储引擎中,只能查询到一条记录。
在这里插入图片描述

Const

主键索引或者唯一索引,只能查询到一条数据
在这里插入图片描述

eq_ref 唯一索引查询

在join中被驱动的表,是通过唯一索引去访问的。

alter table teacher_contact add primary key (tcid);
explain select t.* from teacher t,teacher_contact tc where t.tcid = tc.tcid;

在这里插入图片描述

ref 非唯一索引查询

alter table teacher add index idx_teacher_tcid(tcid);
explain select t.* from teacher t where t.tcid = 1;

在这里插入图片描述

range 索引范围查询

alter table teacher add index idx_teacher_tid(tid);
explain select t.* from teacher t where t.tid < 3;
explain select t.* from teacher t where t.tid between 1 and 2;
explain select t.* from teacher_contact t where t.tcid in (1,2)

在这里插入图片描述

index (full index scan)

explain select t.tid from teacher t where t.tid 

在这里插入图片描述

ALL(full table scan)全表扫描

explain select * from course t where t.cname = 'huathy'

在这里插入图片描述

possible_keys、key

possible_keys:可能使用到的索引。
key:实际使用的索引。
有没有可能possible_keys是空的而实际key有值?有可能。基于成本的优化器会存在,覆盖索引和索引条件下推的情况。

key_len 使用的索引长度

使用的索引长度。

-- username varchar(255) null,
-- utf8mb3 一个字符占3个字节 255 * 3 = 765 + 2(varchar变长) + 1(null可以为空)
-- utf8mb4 一个字符占4个字节 1020 * 4 = 765 + 2(varchar变长) + 1(null可以为空)

ref筛选数据的参考

const 表示使用参数为常量

rows预计扫描行数

InnoDB预读行数不太准确,而MyISAM统计较准。
MyISAM记录了我们的数据总行数。
如果返回行数与需要的结果相差太大,说明SQL需要优化。

filtered 过滤百分比

数据库:Server层 == 存储引擎层(InnoDB)
如果filtered为100表示返回数据都是Server层所需要的。而如果值很低,说明SQL需要优化。

Extra 额外的信息

执行计划给出的额外信息。

using index 覆盖索引

select 查询的字段,刚好在索引中。就不需要回表操作。

using where

存储引擎返回的数据不全是客户端所需要的,需要在Server层进行过滤。

using index Conditon (默认开启)

索引条件下推。本来无法利用索引。但某些条件下可以将需要查询的条件下推到存储引擎。先让存储引擎进行过滤。

using filesort 不能直接使用索引排序

不能直接使用索引排序,而是使用其他字段进行排序。
在这里插入图片描述

using temporary 使用临时表

得到最终需要使用临时表来存储数据。eg:在非索引字段上去重,在非索引字段上分组。

在这里插入图片描述

优化案例

  1. 在limit查询偏移量很大的时候。
select * from user_innodb limit 4000000,10;		-- 4秒
select * from user_innodb where id > 4000000 limit 10;	-- 0.1秒

业务优化

熔断降级。业务分流。流量削峰。
或者更换非关系的数据库,eg:Redis、MongoDB。

数据库服务端状态

show full processlist;

show status;

show engine innodb status;

附:

MySQL中文网站:https://mysql.net.cn/doc/refman/8.0/en/

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT 与 MindShow 一分钟搞定一个PPT

前言 PPT制作是商务、教育和各种场合演讲的重要组成部分。然而&#xff0c;很多人会花费大量时间和精力在内容生成和视觉设计方面。为了解决这个问题&#xff0c;我们可以利用两个强大的工具——ChatGPT和MindShow&#xff0c;来提高制作PPT的效率。 一、ChatGPT 与 MindShow…

Linux操作系统ARM体系结构处理器机制原理与实现

ARM 的概念ARM(Advanced RISC Machine)&#xff0c;既可以认为是一个公司的名字&#xff0c;也可以认为是对一类微处理器的通称&#xff0c;还可以认为是一种技术的名字。ARM 公司并不生产芯片也不销售芯片&#xff0c;它只出售芯片技术授权。其合作公司针对不同需求搭配各类硬…

ChatGPT惨遭围剿?多国封杀、近万人联名抵制……

最近&#xff0c;全世界燃起一股围剿ChatGPT的势头。由马斯克、图灵奖得主Bengio等千人联名的“暂停高级AI研发”的公开信&#xff0c;目前签名数量已上升至9000多人。除了业内大佬&#xff0c;欧盟各国和白宫也纷纷出手。 最早“动手”的是意大利&#xff0c;直接在全国上下封…

SwinTransformer学习

参考&#xff1a; Swin-Transformer网络结构详解 https://blog.csdn.net/qq_37541097/article/details/121119988 x.1 前言 x.1.1 特点 它具有两个特点&#xff1a; 采用类似卷积神经网络中的层次构建方法采用W-MSA和SW-MSA全新的位置编码方式 层次构建方法 相比较于ViT&…

从零开始学Python第12课:常用数据结构之集合

在学习了列表和元组之后&#xff0c;我们再来学习一种容器型的数据类型&#xff0c;它的名字叫集合&#xff08;set&#xff09;。说到集合这个词大家一定不会陌生&#xff0c;在数学课本上就有这个概念。如果我们把一定范围的、确定的、可以区别的事物当作一个整体来看待&…

有符号加法运算

实例 module Signed_add(input signed [3:0] a,input signed [3:0] b,output signed [4:0] out );wire signed [3:0] a1;wire [3:0] a2;wire signed [3:0] b1;wire [3:0] b2;wire signed [4:0] out1;wire [4:0] out2;wire signed [4:0] out3;wire …

五步教你如何注册一个公司网站

在今天的数字化时代&#xff0c;每个公司都需要一个强大的线上存在感。注册一个公司网站是实现这一目标的第一步。但是&#xff0c;对于许多公司而言&#xff0c;这个过程可能有些困难。因此&#xff0c;在本文中&#xff0c;我将介绍一个五步计划&#xff0c;让您轻松注册一个…

【SpringBoot】面试组合技-天羽屠龙舞,SpringBootApplication注解的作用是什么?SpringBoot怎么实现自动装配的?

SpringBoot源码下载地址&#xff1a;https://github.com/spring-projects/spring-boot/tags 文章目录&#x1f35f;下载源码&#x1f357;环境准备&#x1f356;注解解析&#x1f35d;SpringBootConfiguration注解&#x1f35b;EnableAutoConfiguration注解&#x1f364;AutoC…

AD20的PCB布线规则设定

目录 1、最小安全间距 2、线宽规则 3、过孔 4、盖油工艺设计 5、内电层焊盘模式设置 6、反焊盘间距设计 7、焊盘与覆铜连接类型 AD20的规则库设定是PCB布线的首要工作&#xff0c;在布线初期就要设置好&#xff0c;布线的过程中还需要动态的变更&#xff0c;因此本篇总结了PCB的…

【Linux】之nc命令(连接与扫描指定端口、监测服务端口的使用情况)解析、详解实例、邮件告警

&#x1f341;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; 文章目录nc命令简介nc命令的安装nc命令语法格式…

【K8S系列】Pod详解

目录 序言 1 前言 2 为什么需要pod 3 什么是Pod&#xff1f; 3.1 Pod的组成 3.2 Pod的用途 3.3 Pod的生命周期 3.4 Pod的特点 4 Pod的使用 5 结论 序言 任何一件事情&#xff0c;只要坚持六个月以上&#xff0c;你都可以看到质的飞跃。 今天学习一下K8s-Pod相关内容&…

SQL删除记录方式汇总

大家好&#xff0c;我是RecordLiu! 今天给大家分享的是SQL中删除记录的不同方式&#xff0c;我会用几道真题来给大家讲解。 题目直达链接&#xff1a; 牛客网在线SQL编程练习 切换到SQL篇就能看到了。 我这里先列下知识点&#xff1a; SQL中进行简单删除的语法是什么?SQL…

关于AI 绘画,我给你总结了一份详细的关键词(Prompt 知识)

写在前面 随着人工智能技术的不断发展&#xff0c;越来越多的应用场景被发掘。其中&#xff0c;AI绘画是一种新兴的领域&#xff0c;其应用范围涵盖了数字媒体、游戏设计、动画制作、艺术创作等多个领域。在本文中&#xff0c;我们将介绍AI绘画的基本概念、发展历程、技术原理…

最新JavaFx JDK17如何正确的打出可以使用的exe软件包

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、提前需要准备&#xff1f;二、打包步骤1.现将module-info.java删除 选中module-info.java 鼠标右键 Refactor 然后选择safe deleted2.编辑设置 路径 Run/edi…

教你安装各种应用环境-Nodejs

因为最近做项目用到了Nodejs&#xff0c;如果直接下那么用到的就是最新版本。我要用以前的版本这就让我产生了写这篇文章的想法。 安装官网 官网&#xff1a;https://nodejs.org/en 如果安装最新的直接下载安装就行&#xff0c;流程可以看后面。 流程 其他版本点击"O…

年薪30W+,待遇翻倍,我的经历值得每个测试人借鉴

从自考大专到出走公司&#xff0c;从半年无业露宿深圳北站&#xff0c;从8k…到11.5k…再到20k&#xff0c;我的经历值得每个测试人借鉴 或许学历并没有那么重要 12年高考之后&#xff0c;在朋友的介绍下&#xff08;骗了过去&#xff09;&#xff0c;没有好好的读大学&#x…

Linux Redis主从复制 | 哨兵监控模式 | 集群搭建 | 超详细

Linux Redis主从复制 | 哨兵监控模式 | 集群搭建 | 超详细一 Redis的主从复制二 主从复制的作用三 主从复制的流程四 主从复制实验4.1 环境部署4.2 安装Redis&#xff08;主从服务器&#xff09;4.3 修改Master节点Redis配置文件 (192.168.163.100)4.4 修改Slave节点Redis配置文…

计算机网络 - TCP的效率与特性

前言 本篇是介绍部分TCP的特性&#xff0c;了解TCP提高传输速率的机制&#xff1b;如有错误&#xff0c;请在评论区指正&#xff0c;让我们一起交流&#xff0c;共同进步&#xff01; 文章目录前言1. 滑动窗口2. 流量控制3.拥塞控制4.延时应答5. 捎带应答6. 面向字节流7. 异常…

Android FrameWork详细教程—第一个启动的程序--init 与 Zygote

第一个启动的程序–init 不管Java还是C运行一个程序都是以main方法作为入口。所以我们先看看init.cpp的main函数. 目录&#xff1a;/system/core/init/main.cpp 具体代码&#xff1a; int main(int argc, char** argv) { #if __has_feature(address_sanitizer)__asan_set_er…

Kaggle 赛题解析 | AMP 帕金森进展预测

文章目录一、前言二、比赛说明1. Evaluation2. Timeline3. Prize4. Code Requirements三、数据说明四、总结&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、前言 竞赛题目&#xff1a;AMP-Parkinson’s Disease Progression Prediction 竞赛地址…