mysql的优化

1、概念

  • 在应用开发的初期,由于数据量较小,开发人员更重视功能上的实现,随着应用系统上线后,数据量急剧增长,很多性能问题逐渐显现,对使用的影响也越来越大,此时这些问题语句就称为整个系统的性能瓶颈,此时必须对其进行优化

  • 常用的优化方式

    – 从设计上

    – 从查询上

    – 从索引上

    – 从存储上

2、查看sql执行频率

  • mysql客户端连接成功后,通过show[session|global] status命令可以查看服务器状态信息,通过状态信息可以查看当前数据库的主要操作类型

    show session status like 'Com_______'; --查看当前会话统计结果show global status like 'Com_______'; --查看自数据库上次启动至今的统计结果show status like 'innoDB_rows_%';  --查看针对innoDB引擎的统计结果
    
    参数含义
    Com_select执行select操作的次数,一次查询只累加1
    Com_insert执行insert操作的次数,批量插入的操作,只累加1次
    Com_update执行update的次数
    Com_delete执行delete操作的次数
    innodb_rows_readselect查询返回的行数
    innodb_rows_insertedinsert操作插入的行数
    innodb_rows_updateupdate操作更新的行数
    innodb_rows_deleteddeleted操作删除的行数
    Connections试图连接mysql服务器的次数
    uptime服务器工作时间
    slow_queries慢查询的次数

3、定位低效率sql语句

​ 有两种方式可以定位执行效率较低的SQL语句

  • 慢查询日志

    show variables like '%slow_query_log%';  -- 查看慢查询日志配置信息set global slow_query_log = 1;  -- 开启慢查询日志show variables like 'long_query_time%';  -- 查看慢查询日志的最低阈值时间set global long_query_time = 4;  --修改最低阈值时间
    
  • show processlist:此命令查看当前mysql正在在进行的线程,包括线程状态、是否锁表等,可以实时地查看sql执行情况,同时对一些锁表操作进行优化

    show processlist;
    

    在这里插入图片描述
    其中:

  • id:用户登录mysql时系统分配的connection_id,可以使用函数connection_id()查看;

  • user:显示当前用户,如果不是root,这个命令就只显示权限范围内的sql语句;

  • host:显示本语句是从哪个ip的哪个端口上发来的,可以用来跟踪出现问题语句的用户;

  • db:显示这个进程目前连接的是哪个数据库;

  • command:显示当前连接的执行的命令,一般取值为休眠(sleep),查询(query),连接(connect)等;

  • time:显示这个状态持续的时间,单位秒;

  • state:显示使用当前连接的sql语句的状态,很重要的列。state描述的是语句执行中的某一个状态。以一个sql查询语句为例,可能需要经过copingy to tmp table、sorting result、sending data等状态才可以完成

  • info:显示这个sql语句,是判断问题语句的一个重要依据

4、explain分析执行计划

​ 查询到效率低的sql语句后,可以通过explain命令获取mysql是如何执行select语句的信息,包括在select语句执行过程中表时如何连接的、已经连接的顺序。

–准备示例数据

create database demo_explain;
use demo_explain;create table user(user_id int primary key auto_increment,user_name varchar(8)
)charset = utf8;
insert into user values(null, '小乔'),(null, '张非'),(null, '曹操');create table role(role_id int primary key auto_increment,role_name varchar(8)
)charset = utf8;
insert into role values(null, '女神'),(null, '屌丝'),(null, '老板');create table user_role(uid int,rid int
)charset = utf8;
alter table user_role add foreign key(uid) references user(user_id);
alter table user_role add foreign key(rid) references role(role_id);
insert into user_role values(1,1),(1,2),(2,2),(3,3);create table privilege(p_id int primary key auto_increment,P_name varchar(8)
)charset = utf8;
insert into privilege(null, '玩跑车'),(null, '挖矿'),(null, '写代码');
explain select * from user where user_id = 1;

在这里插入图片描述
字段解释如下表:

字段含义
idselect查询的序列号,是一组数字,表示的是执行select子句或者操作表的顺序
select_typeselect的类型,常有simple(简单,即不适用表连接或子查询),primary(主查询,即外层查询),union(union中第二个或后面的查询语句,subquery(子查询中的第一个select)等
table输出结果集的表,即本次查询用到的表
type表示表的连接类型,性能由好至差的连接类型顺序为:system–>const–>eq_ref–>ref–>ref_or_null–>index_merge–>index_subquery–>range–>index–>all
possible_keys查询时可能使用的索引
key实际使用的索引
key_len索引字段的长度
rows扫描行的数量
extra执行情况的说明和描述
  • explain之id

    1、id相同加载表的顺序是从上到下;

    explain select * from user as u, user_role as ur, role as r 
    where u.user_id = ur.u_id and ur.r_id = role_id;
    

    在这里插入图片描述

    2、id不相同时,id值越大优先级越高,越先被执行;

    explain select * from role where role_id = (select r_id from user_role where u_id = (select user_id from user where user_name = '张非'));
    

在这里插入图片描述

3、id同时存在相同和不同时,相同的id可以认为是一组,从上往下顺序执行;在不同组中,id值越大,该组优先级越高,越先执行。

explain select * from role as r, (select * from user_role as ur where ur,u_id = (select user_id from user where user_name = '张非')) t1 where r.r_id = t1.r_id

在这里插入图片描述

  • explain之select_type:表示select的类型,常见的取值如下表

    select_type含义
    simply简单的select语句,语句中不包含子查询或union
    primary查询中如包含认可复杂子句,主查询(最外层查询)标记为该标识
    subquery在select或where列表中包含子查询
    derived在from列表中包含的子查询,被标记为derived(衍生),mysql会递归执行这些子查询,把结果放在临时表中
    union如第二个select出现在union之后,则标记为union;如union包含在from子句的子查询中,外层select将被标记为:derived
    union result从union表获得结果的select
  • type显示的是访问类型,是较重要的一个指标,可取值为:

    type含义
    nullmysql不访问任何表,索引,直接返回结果
    system系统表,少量数据,通常不需要进行磁盘i/o;5,7以上的版本变更成了all,即使只有一条记录
    const命中主键(primary key)或唯一(unique)索引,被连接的部分是一个常量(const)值
    eq_ref对于前表的每一行,后表只有一行扫描:1、jion查询;2、命中主键(primary key)或非空唯一(unique not null)索引;3、等值连接
    ref非唯一索引扫描,返回匹配某个单独值的所有行,对于前表的每一行(row),后表可能有多于一行的数据被扫描。
    range只检索给定返回的行,使用一个索引来选择行,where之后出现between,<,>,in等操作
    index需要扫描索引上的全部数据
    all全表扫描,此时id上无索引
  • explain之extra:其他的额外的信息在该列显示

    extra含义
    using filesortMysql会对数据使用一个外部索引排序,而不是按照表内的所有顺序进行读取,称为‘文件排序’,效率低
    using temporary需要建立临时表(temporary)来暂存中间结果,常见与order by 和group by,效率低
    using indexsql需要返回的所有列数据均在一颗索引树上,避免访问表的数据行,效率较高

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

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

相关文章

栈的应用,力扣394.字符串解码力扣946.验证栈序列力扣429.N叉树的层序遍历力扣103.二叉树的锯齿形层序遍历

目录 力扣394.字符串解码 力扣946.验证栈序列 力扣429.N叉树的层序遍历 力扣103.二叉树的锯齿形层序遍历 力扣394.字符串解码 看见括号&#xff0c;由内而外&#xff0c;转向用栈解决。使用两个栈处理&#xff0c;一个用String,一个用Integer 遇到数字:提取数字放入到数字栈…

【Python系列】 Base64 编码:使用`base64`模块

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Mac 修改默认jdk版本

当前会话生效 这里演示将 Java 17 版本降低到 Java 8 查看已安装的 Java 版本&#xff1a; 在终端&#xff08;Terminal&#xff09;中运行以下命令&#xff0c;查看已安装的 Java 版本列表 /usr/libexec/java_home -V设置默认 Java 版本&#xff1a; 找到 Java 8 的安装路…

C++ STL - vector/list讲解及迭代器失效

vector 使用 vector 是一个动态数组. 构造/拷贝构造/赋值重载函数 int main() {// 是一个模板, 在实例化的时候, 需要指明类型std::vector<int> first; // 一个空的数组std::vector<int> second (4,100); // 设置初始空间大小为 4 个int, 全部初始化为 100std::v…

libphone desktop编译

linphone-desktop 在ubuntu20.04 下编译 linphone 介绍 Linphone是一款遵循GPL的开源网络视频电话系统&#xff0c;支持多种平台如Windows、Linux、Android等。它基于SIP协议&#xff0c;提供语音、视频通话及即时文本消息功能。核心功能包括SIP用户代理、音频视频Codec支持、…

根据已知站点寻找路网的最短路径

背景 接上期&#xff0c;基于MATSim的交通仿真&#xff0c;其中有一块非常重要的就是公交的仿真&#xff0c;这也是当初选择MATSim技术路线的一个重要原因&#xff0c;现在业务给出的场景是上传一些有序站点及其经纬度&#xff0c;需要通过算法来适配对应的路网&#xff0c;由…

Jenkins + gitee 自动触发项目拉取部署(Webhook配置)

目录 前言 Generic Webhook Trigger 插件 下载插件 ​编辑 配置WebHook 生成tocken 总结 前言 前文简单介绍了Jenkins环境搭建&#xff0c;本文主要来介绍一下如何使用 WebHook 触发自动拉取构建项目&#xff1b; Generic Webhook Trigger 插件 实现代码推送后&#xff0c;触…

leetcode 919.完全二叉树插入器

1.题目要求: 完全二叉树 是每一层&#xff08;除最后一层外&#xff09;都是完全填充&#xff08;即&#xff0c;节点数达到最大&#xff09;的&#xff0c;并且所有的节点都尽可能地集中在左侧。设计一种算法&#xff0c;将一个新节点插入到一棵完全二叉树中&#xff0c;并在…

SSL协议

文章目录 1. 前言2. 基础概念3. SSL协议结构3.1 概述3.2 SSL握手协议3.3 修改密码说明协议3.4 报警协议3.5 SSL记录协议 4. SSL安全性4.1 安全机制分析4.2 脆弱性分析 5. SSL证书 1. 前言 参考《应用系统安全基础》 2. 基础概念 安全套接字层协议&#xff08;Security Socke…

Flink-Source的使用

Data Sources 是什么呢&#xff1f;就字面意思其实就可以知道&#xff1a;数据来源。 Flink 做为一款流式计算框架&#xff0c;它可用来做批处理&#xff0c;也可以用来做流处理&#xff0c;这个 Data Sources 就是数据的来源地。 flink在批/流处理中常见的source主要有两大类…

Linux线程_线程控制_线程库

一.线程控制 在Linux操作系统的视角&#xff0c;Linux下没有真正意义上的线程&#xff0c;而是用进程模拟的线程&#xff08;LWP&#xff09;。所以&#xff0c;Linux不会提供直接创建线程的系统调用&#xff0c;而是提供创建轻量级进程的接口。但是由于用户只认线程&#xff0…

计算机网络:运输层 —— TCP 的超时重传机制

文章目录 TCP 的超时重传超时重传时间的选择重传策略与拥塞控制的关联 TCP 的超时重传 TCP 的超时重传是保证数据可靠传输的重要机制之一 保证数据可靠性&#xff1a;通过超时重传机制&#xff0c;即使在网络状况不佳&#xff0c;出现数据包丢失等情况时&#xff0c;也能够确保…

C嘎嘎探索篇:和stack,queue的相遇

C嘎嘎探索篇&#xff1a;和stack&#xff0c;queue的再次相遇 前言&#xff1a; 小编在前几日刚完成了关于list容器的介绍&#xff0c;中间由于我牙齿出现了问题所以断更了不少天&#xff0c;如今我牙齿已经恢复&#xff0c;我也要开始继续新内容的讲解了&#xff0c;各位读者…

GPTZero:高效识别AI生成文本,保障学术诚信与内容原创性

产品描述 GPTZero 是一款先进的AI文本检测工具&#xff0c;专为识别由大型语言模型&#xff08;如ChatGPT、GPT-4、Bard等&#xff09;生成的文本而设计。它通过分析文本的复杂性和一致性&#xff0c;判断文本是否可能由人类编写。GPTZero 已经得到了超过100家媒体机构的报道&…

MyBatis Plus 项目的创建和使用

1. 快速上手 1.1. 项目的创建和配置 首先&#xff0c;创建一个 Spring Boot 工程&#xff0c;添加 MyBatis Plus 和 MySQL 对应的依赖&#xff0c;然后&#xff0c;和 MyBatis 一样&#xff0c;需要在 yml 文件中配置数据库连接信息 <dependency><groupId>com.b…

IDEA 2024.3 版本更新主要功能介绍

IDEA 2024.3 版本提供的新特性 IntelliJ IDEA 2024.3 的主要新特性&#xff1a; AI Assistant 增强 改进的代码补全和建议更智能的代码分析和重构建议Java 支持改进 支持 Java 21 的所有新特性改进的模式匹配和记录模式支持更好的虚拟线程调试体验开发工具改进 更新的 UI/UX 设…

Java编程,配置mongoUri连接mongodb时,需对特殊字符进行转义

一、背景 java程序连接mongo有两种方式&#xff1a; 用户名和密码方式uri方式 1、用户名和密码 以用户数据库为例&#xff0c;注意看它的密码 spring:data:mongodb:host: 192.168.10.17database: db_user_serviceport: 3717username: user_servicepassword: user_service3…

学习笔记|MaxKB对接本地大模型时,选择Ollma还是vLLM?

在使用MaxKB开源知识库问答系统的过程中&#xff0c;除了对接在线大模型&#xff0c;一些用户出于资源配置、长期使用成本、安全性等多方面考虑&#xff0c;还在积极尝试通过Ollama、vLLM等模型推理框架对接本地离线大模型。而在用户实践的过程中&#xff0c;经常会对候选的模型…

Python 快速入门(上篇)❖ Python基础知识

Python 基础知识 Python安装**运行第一个程序:基本数据类型算术运算符变量赋值操作符转义符获取用户输入综合案例:简单计算器实现Python安装** Linux安装: yum install python36 -y或者编译安装指定版本:https://www.python.org/downloads/source/ wget https://www.pyt…

【1.2 Getting Started--->Installation Guide】

NVIDIA TensorRT DOCS 此 NVIDIA TensorRT 10.6.0 安装指南提供安装要求、TensorRT 包中包含的内容列表以及安装 TensorRT 的分步说明。 安装指南 摘要&#xff1a; 本 NVIDIA TensorRT 10.3.0 安装指南提供了安装要求、TensorRT 软件包中包含的内容列表以及安装 TensorRT 的…