Mysql语句性能优化

SQL查询过程

在这里插入图片描述

  • 查询缓存: 执行查询语句的时候,会先查询缓存(MySQL 8.0 版本后移除,因为这个功能不太实用)。
  • 分析器: 没有命中缓存的话,SQL 语句就会经过分析器,分析器说白了就是要先看你的 SQL 语句要干嘛,再检查你的 SQL 语句语法是否正确。
  • 优化器: 按照 MySQL 认为最优的方案去执行。
  • 执行器: 执行语句,然后从存储引擎返回数据。 执行语句之前会先判断是否有权限,如果没有权限的话,就会报错。
  • 插件式存储引擎:主要负责数据的存储和读取,采用的是插件式架构,支持 InnoDB、MyISAM、Memory 等多种存储引擎。

创建高性能索引

什么是索引

数据库表中的一种数据结构,用于加速数据检索。通过创建索引,数据库可以更快速地找到所需的数据,而不需要扫描整个表。

为什么需要索引

MySQL 索引优化是提高数据库查询性能的重要手段。索引可以显著减少数据库需要扫描的数据量,从而加快查询速度。但索引的使用和管理也需要谨慎,错误的索引策略可能会导致性能下降或增加维护成本。

索引原理

数据结构:

  • B+ 树:MySQL 的默认索引结构是 B+ 树,它是一种自平衡的树数据结构。B+ 树的每个节点包含多个键值和指向子节点的指针。B+ 树的叶子节点还包含数据指针或者数据行的 ID(在聚簇索引中)。在 B+ 树中,所有叶子节点处于同一层级,这使得查找、插入和删除操作的时间复杂度为 O(log N)。
  • 哈希表:用于 HASH 索引(如 MEMORY 存储引擎),哈希表通过计算哈希值来直接访问数据,但不支持范围查询。

索引类型

  • 主键索引(Primary Key Index):唯一标识表中的每一行,自动创建在主键列上。
  • 唯一索引(Unique Index):确保索引列中的所有值都是唯一的。
  • 普通索引(Regular Index):最常用的索引类型,没有唯一性限制。
  • 全文索引(Full-Text Index):用于全文搜索,如搜索包含特定单词的文本。
  • 组合索引(Composite Index):索引多个列,可以加速对这些列的组合查询。

索引优化

  1. 唯一性索引的值是唯一的,可以更快速的通过该索引来确定某条记录。
  2. 为经常需要排序、分组和联合操作的字段建立索引。
  3. 为常作为查询条件的字段建立索引。
  4. 限制索引的数目:越多的索引,会使更新表变得很浪费时间。
  5. 尽量使用数据量少的索引。如果索引的值很长,那么查询的速度会受到影响。
  6. 尽量使用前缀来索引,如果索引字段的值很长,最好使用值的前缀来索引。
  7. 删除不再使用或者很少使用的索引
  8. 最左前缀匹配原则,非常重要的原则。
  9. 尽量选择区分度高的列作为索引
  10. 索引列不能参与计算,保持列“干净”:带函数的查询不参与索引。
  11. 尽量的扩展索引,不要新建索引。

慢SQL优化

抓取慢SQL

启用慢查询日志

慢查询日志可以记录所有执行时间超过指定阈值的查询。
编辑 MySQL 配置文件(通常是 my.cnf 或 my.ini):

slow_query_log = 1
slow_query_log_file = /path/to/your/slow-query.log
long_query_time = 2

slow_query_log: 启用慢查询日志(1 表示启用,0 表示禁用)。
slow_query_log_file: 指定日志文件的路径。
long_query_time: 设置慢查询的时间阈值(单位为秒),例如 2 表示记录执行时间超过 2 秒的查询。

查看慢查询日志

可以直接查看配置的日志文件,或者使用工具来分析日志,例如 mysqldumpslow 或 pt-query-digest(来自 Percona Toolkit)。
使用 mysqldumpslow:

mysqldumpslow -s t -t 10 /path/to/your/slow-query.log

-s t:按时间排序。
-t 10:显示前 10 条最慢的查询

实时监控

可以使用 MySQL 的内置工具或第三方监控工具进行实时查询分析:

  • MySQL Workbench:提供了图形化的慢查询分析功能。
  • Grafana + Prometheus:可以结合 MySQL Exporter 监控数据库性能,包括慢查询。

EXPLAIN 命令

使用 EXPLAIN 命令来分析 SQL 的 执行计划 。执行计划是指一条 SQL 语句在经过 MySQL 查询优化器的优化会后,具体的执行方式。

EXPLAIN 并不会真的去执行相关的语句,而是通过 查询优化器 对语句进行分析,找出最优的查询方案,并显示对应的信息。

EXPLAIN 适用于 SELECT, DELETE, INSERT, REPLACE, 和 UPDATE语句,我们一般分析 SELECT 查询较多。

在这里插入图片描述

  1. id:
    描述: 查询的唯一标识符。对于多表查询,id 用于区分不同的 SELECT 语句。
    分析: 数字越大,执行优先级越高。相同的 id 表示这些操作可以并行执行。
  2. select_type:
    描述: 查询类型,如简单查询、联合查询、子查询等。
    常见值:
  • SIMPLE: 简单查询,不包含子查询或联合查询。
  • PRIMARY: 主查询(包含子查询的最外层查询)。
  • SUBQUERY: 子查询。
  • DERIVED: 派生表(子查询的结果作为临时表)。
  1. table:
    描述: 执行查询时访问的表名。
    分析: 确保查询访问的表是期望的,检查是否有意外的表被访问。
  2. type:
    描述: 访问类型,表示查询 MySQL 表的方式。
    常见值:
  • ALL: 全表扫描(性能最差)。
  • index: 索引扫描(读取索引而不是实际表数据)。
  • range: 范围扫描(使用索引的范围查找)。
  • ref: 通过索引查找单个记录。
  • eq_ref: 对每个索引值只返回一行记录。
  • const: 常量(单行查找,性能最好)。
  1. possible_keys:
    描述: 查询可能使用的索引列表。
    分析: 确保查询能够利用到索引。如果没有显示预期的索引,可能需要检查索引的设计或优化查询条件。
  2. key:
    描述: 实际使用的索引。
    分析: 确认查询是否使用了期望的索引。未使用索引可能表示索引不适用或者索引未被使用。
  3. key_len:
    描述: 使用的索引的长度。
    分析: 该值帮助确定索引的使用效率。较短的长度通常表示使用了索引的部分字段。
  4. ref:
    描述: 显示哪个列或常量与索引一起被使用。
    分析: 确保使用的是索引的前缀列。比如 const 表示对每个索引值只返回一行记录,ref 表示用某个字段值来查找记录。
  5. rows:
    描述: MySQL 估计的要扫描的行数。
    分析: 这是 MySQL 预估的数量,通常用于比较不同执行计划的成本。较大的值可能表示查询效率低。
  6. Extra:
    描述: 额外的执行信息。
    常见值:
  • Using where: 使用 WHERE 子句过滤记录。
  • Using index: 使用覆盖索引(只从索引中获取数据)。
  • Using filesort: 使用文件排序(可能导致额外的性能开销)。

参考:

MySQL索引优化(超详细)
MYSQL执行计划分析性

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

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

相关文章

算法之二分查找法和双指针

用二分查找法刷leetcode算法题目的时候&#xff0c;经常遇到视频看着理解很透彻&#xff0c;当上手写时一看就会&#xff0c;一写就废。二分查找法涉及边界条件很多&#xff0c;逻辑很简单&#xff0c;就是写不好。何时写 while(left<right)&#xff0c;while(left<right…

通过写文件方式写入 Hive 数据

通过写文件方式写入 Hive 数据 Hive最简单的写入数据方式就是通过Hive Jdbc写入Hive数据&#xff0c;但这并不是写入Hive最高效的方法。 Hive通过读取相关Hdfs的文件来获取数据信息&#xff0c;而通过直接写入Hdfs文件数据达到写入Hive数据的效果&#xff0c;这是目前最高效的…

nerfstudio半离线配置踩坑记录

安装torch2.1.2 with cuda11.8 由于清华镜像源&#xff08;包括阿里源和豆瓣源&#xff09;都没有torch2.1.2cu118的包&#xff0c;因此只能从pytorch官网下载。 服务器上直接通过下面pip的方式安装会由于网络原因中断&#xff0c;无奈只能在本地先把torch的包下载下来再上传到…

SAP与生产制造MPM系统集成案例

一、需求介绍 某公司为保证企业内部生产管理系统的多项基础数据的同步更新&#xff0c;确保各模块间信息的一致性和准确性&#xff0c;对后续的生产计划和物料管理打下基础&#xff0c;该公司将MPM系统和SAP系统经过SAP PO中间件集成平台进行了集成。MPM全称为Manufacturing…

blender--二维平面图标变为三维网格

有时候我们希望把一些二维图片能变成三维网格&#xff0c;本案例我们就针对这一场景进行实现。 首先我们可以先去找一张需要的图片(注意&#xff0c;本例需要图片是svg格式)&#xff0c;我们可以在阿里巴巴矢量图标库等平台进行搜索&#xff0c;如图所示&#xff0c;找到需要的…

diffusion model(扩散模型)DDPM解析

DDPM 前向阶段 重复 2-5 步骤 x 0 ∼ q ( x 0 ) \mathbf{x}_0\sim q(\mathbf{x}_0) x0​∼q(x0​)从数据集中采样一张图片 t ∼ U n i f o r m ( { 1 , … , T } ) t\sim\mathrm{Uniform}(\{1,\ldots,T\}) t∼Uniform({1,…,T})&#xff0c;从 1~T 中随机挑选一个时间步 t ϵ …

三种tcp并发服务器实现程序

都需先进行tcp连接 1、多进程并发 2、多线程并发 3、IO多路复用并发 &#xff08;1&#xff09;select &#xff08;2&#xff09;epoll

SAP ERP与长城汽车EDI业务集成案例(SAP CPI平台)

一、项目背景 某智能座舱公司是国内领先的智能座舱领域科技公司&#xff0c;致力于成为智能网联行业变革的领导者和推动者&#xff0c;聚焦整车域控制器产品、智能网联软件产品和运营服务产品&#xff1b; 已建成首条先进的数智化域控制器生产线&#xff0c;为客户提供最优…

大刀阔斧改革之后,阅文距离“东方迪士尼”更近了吗?

当前&#xff0c;网文IP的确是“富矿”。中国社会科学院文学研究所发布的《2023中国网络文学发展研究报告》显示&#xff0c;截至2023年底&#xff0c;网络文学IP市场规模2605亿元&#xff0c;同比增长近百亿元。 近日&#xff0c;网文产业中的头部企业阅文集团也披露数据称&a…

Android U WMShell动画调用堆栈

本文主要简单介绍WMShell动画调用堆栈 代码环境&#xff1a;repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-14.0.0_r7 Systemserver侧 TAG: at com.android.server.wm.Transition.onTransactionReady(Transition.java:1575) TA…

爆改YOLOv8|利用分层特征融合策略MSBlock改进yolov8,暴力涨点

1&#xff0c;本文介绍 MSBlock 是一种分层特征融合策略&#xff0c;用于改进卷积神经网络中的特征融合效果。它通过分层次地融合不同尺度的特征图来提高网络的表达能力和性能。MSBlock 采用多尺度特征融合的方法&#xff0c;确保网络能够有效地捕捉不同层次和尺度的信息&…

Neo4j导入csv数据,并创建节点

Neo4j 是一种图数据库&#xff0c;特别适合管理和分析复杂的关系数据。 数据来源&#xff1a;http://openkg.cn/ 导入到 Neo4j 的合适场景&#xff1a; 需要在物种分类中查找层级关系&#xff08;如物种的科、属等&#xff09;。 需要进行关系查询和图结构的分析。 想在分类树…

【Axure高保真原型】输入框控制多选下拉列表选项

今天和大家分享输入框控制多选下拉列表选项选项的原型模板&#xff0c;效果包括&#xff1a; 点击下拉框可以弹出选项列表&#xff0c;点击可以切换选中或取消选中 根据选中项在外框出自动生成标签&#xff0c;可以自适应调整高度 下拉列表的选项由左侧多行输入框里的内容控制…

数据结构—— 再探二叉树

1. TOP-K问题 TOP-K问题&#xff1a;求数据结合中前K个最大或者最小的数据 比如&#xff1a;专业前10名、世界500强、富豪榜、游戏中前100的活跃玩家等 思路&#xff1a; 1. 用数据集合中前K个数据来建堆&#xff1a; …

WEB服务器-Nginx源码安装及相关配置

一、web服务的常用种类 Apache HTTP Server 简介&#xff1a;Apache是一款广泛使用的Web服务器软件&#xff0c;支持多种操作系统&#xff0c;包括Linux。​​​​​​​特点&#xff1a; 支持多个虚拟主机。 模块化架构&#xff0c;可以根据需要加载不同的模块。 强大的安全…

多态(虚构的整体,具体的个体)(多态的基本概念/多态的原理剖析/纯虚函数和抽象类/虚析构和纯虚析构)

多态的基本概念 #define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std; // 多态的基本概念 // 多态分为静态多态和动态多态 // 静态多态&#xff1a; 函数重载还运算符重载属于静态多态&#xff0c;服用函数名 // 动态多态&#xff1a; 派生派和虚函…

VUE使用websocket

在之前搭建好的项目的基础上新版security demo&#xff08;二&#xff09;前端-CSDN博客 目录 一、代码改造 1、后端改造 2、VUE使用websocket 3、测试 二、按用户推送 1、完整代码如下 1.1、前端 1.2、后端&#xff1a; 2、测试 一、代码改造 1、后端改造 &#x…

逆波兰表达式

简介 介绍逆波兰表达式之前&#xff0c;先介绍一下运算种类。 中缀运算与后缀运算 中缀运算是一种常用的算术和逻辑公式表示方法&#xff0c;其中操作符位于两个运算数之间。例如&#xff0c;在表达式 “3 2” 中&#xff0c;加号&#xff08;&#xff09;是操作符&#xf…

算法设计:实验一分治与递归

【实验目的】 深入理解分治法的算法思想&#xff0c;应用分治法解决实际的算法问题。 【实验内容与要求】 设有n2k个运动员要进行网球循环赛。现要设计一个满足以下要求的比赛日程表&#xff1a; 1.每个选手必须与其他n-1个选手各赛一次&#xff1b;2.每个选手一天只能赛一…

Mysql 集群技术

目录 一 Mysql 在服务器中的部署方法 1.1 在Linux下部署mysql 1.1.1 安装依赖性并解压源码包&#xff0c;源码编译安装mysql&#xff1a; 1.1.2 部署mysql 二 mysql的组从复制 2.1 配置mastesr和salve 测试结果 2.2 当有数据时添加slave2 2.3 延迟复制 2.4 慢查询日志…