Mysql语句性能优化

news2024/9/20 18:54:16

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.coloradmin.cn/o/2073213.html

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

相关文章

logistic方程求解和模拟

logistic规律可以用以下式子表示 N(t1)​k*N(t)*​(N-N(t)) 其中N(t)为t时刻种群的数量,N为环境最大容纳的的种群数 k的取值通常与N有关,大约在1/N和4/N之间 题目如下 假设一些参数后的代码如下 T100; T11:T; N11000; a13/N1; Q800; N2700; a2-0.2/…

洛谷 P10119 『STA - R4』踱步

题目来源于:洛谷 题目本质:动态规划及优化,单调队列 题目思路: 设 fi,k,op​ 表示对于前 i 个位置,强制在 i1 分钟初踱步,总共踱步 k 次,且第 i 分钟在屋内(op0)或屋外…

leetcode73. 矩阵置零,简单模拟

leetcode73. 矩阵置零 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1: 输入:matrix [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0,1],[0,0,0],[1,0,1]] 示…

Stable Diffusion之提示词指南(二)

在上一篇的文章中,我们讲解了Stable Diffusion提示词的基本用法,不了解的到可以去学习一下———Stable Diffusion之提示词指南(一)。这章我们再详细讲解一下其他高级用法和负提示词。 注意:部分语法只是适用于AUTOMATIC1111 Web UI(以下简称…

SpringBoot集成kafka-指定topic(主题)-partition(分区)-offset(偏移量)消费信息

SpringBoot集成kafka-指定topic-partition-offset消费信息 1、消费者2、生产者3、配置类4、配置文件5、实体类6、工具类7、测试类8、第一次测试(读取到19条信息)9、第二次测试(读取到3条信息) 1、消费者 指定消费者读取配置文件中…

[pytorch] --- pytorch环境配置

本教程环境搭建基于windows 1 安装miniconda 1.1 miniconda与anaconda的区别 包含的包: Anaconda: 是一个较大的发行版,预装了大量的科学计算和数据分析相关的 Python 包。Miniconda: 更轻量级,只包含 Conda、Python 和它们的依赖,以及少…

微信小程序获取用户openId并通过服务端向用户发送模板消息

1.引言 注意: 1.标题中的服务端是自己研发的服务端,不是腾讯公司的服务端。 2.小程序的模板消息分为一次性订阅消息与长期订阅,一次性订阅就是每次在给用户发送消息之前都需要获得用户的同意(即用户订阅)&#xff0…

数据结构(树、平衡树、红黑树)

目录 树 树的遍历方式 平衡二叉树 旋转机制 左旋 右旋 旋转实例 左左 左右 右右 右左 总结 红黑树 树 相关概念 节点的内部结构如下 二叉树与二叉搜索树的定义 树的遍历方式 前序遍历:当前节点,左子节点,右子结点 中序遍历&a…

React学习day01-React-开发环境配置、JSX基础-本质、JSX中js表达式的用法、JSX的条件渲染

1、React (1)概念:由Meta公司研发,是一个用于构建Web和原生交互页面的库 (2)优点: 1)相较于传统基于DOM开发的优势:组件化的开发方式、不错的性能 2)相较于…

软件设计原则之单一职责原则

目录 单一职责原则单一职责原则的主要特点应用范围Demo用户信息日志记录 单一职责原则 单一职责原则(Single Responsibility Principle,简称SRP)是面向对象设计中的一个重要原则,其核心思想是:一个类应该仅有一个引起…

ollma 本地部署大模型

因为我本地是 windows 的系统,所以这里直接写的是通过 docker 来实现本地大模型的部署。 windows 下 WSl 的安装这里就不做重复,详见 windows 部署 mindspore GPU 开发环境(WSL) 一、Docker 部署 ollma 1. 拉取镜像(…

Ubuntu系统设置Java项目开机自启

1、创建自启动脚 sudo vi /etc/systemd/system/java-service.service 2、编辑自启脚本 [Unit]部分包含了service的描述和依赖关系。在这个示例中,我们将其设置为在系统启动后执行。 [Service]部分定义了service的执行方式。在这个示例中,我们指定了Java…

shell工具箱集合!!

shell工具箱集合 1.shell工具箱集合 2.Chrony 时间同步 3.Get_host_Info 设备信息收集 4.Init_host 系统初始化 5.Iperf 带宽测试套件 6.Lagscope_test 时延测试套件 7.Mtr_test 双向路由探测套件 下载地址: https://pan.quark.cn/s/6936cc13bc04

学习笔记——Redis基础

文章目录 Redis五种常用数据类型Redis常用命令Spring Data Redis使用方式操作步骤 Redis五种常用数据类型 Redis存储的是key-values结构的数据,其中key是字符串类型,value有五种常用的数据类型: 字符串(string)&…

C++入门基础知识32——【关于C++ 存储类之auto存储类】

成长路上不孤单😊【14后,C爱好者,持续分享所学,如有需要欢迎收藏转发😊😊😊😊😊😊😊!!!!&#xff…

Flex的基本使用+综合案例

组成 弹性盒子没有设置高&#xff0c;就会自动拉伸 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport&q…

高并发下阻塞队列的选择

高并发下阻塞队列的选择 一、队列 队列&#xff1a;queue。简称队&#xff0c;它和堆栈一样&#xff0c;也是一种运算受限的线性表&#xff0c;其限制是仅允许在表的一端进行插入&#xff0c;而在表的另一端进行删除。 简单的说&#xff0c;采用该结构的集合&#xff0c;对元素…

洛谷 P2569 [SCOI2010] 股票交易

题目来源于&#xff1a;洛谷 题目本质&#xff1a;动态规划&#xff0c;单调队列 解题思路&#xff1a; 方程f[i][j]表示第 i 天结束后&#xff0c;手里剩下 j 股的最大利润&#xff0c;则不买不卖&#xff1a;f[i][j]f[i-1][j]。 买入&#xff1a;f[i][j]max{f[i-w-1][k]k*…

Spring DI 数据类型——构造注入

首先新建项目&#xff0c;可参考 初识 IDEA 、模拟三层--控制层、业务层和数据访问层 一、spring 环境搭建 &#xff08;一&#xff09;pom.xml 导相关坐标 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.…

【Kubernetes】K8s 持久化存储方式

K8s 持久化存储方式 1.使用节点数据卷2.使用网络数据卷3.使用临时数据卷 由于容器是一种无状态的服务&#xff0c;所以容器中的文件在宿主机上表现出来的都是临时存放&#xff08;当容器崩溃或者重启时&#xff0c;容器中的文件会丢失&#xff09;。另外&#xff0c;Kubernetes…