高性能mysql-查询性能优化

优化的核心

一个任务是由很多子任务组成的,每个子任务都会消耗一定时间,如果优化查询,要么消去一些子任务,要么让子任务更快。

慢查询的基础:优化数据访问

减少访问的行数。
在mysql服务器层是否在分析大量不必要的行。

扫描的行数和返回的行数

通常在1:1到10:1之间,比如一个联级查询,要扫描多行才能返回一行。

扫描的行数和访问类型

mysql有很多访问方式可以查找并且返回一行结果。
这些方式可能需要访问很多行才能返回一行结果,也可以不需要访问。
explain的type列反应了访问类型:全表扫描,索引扫描,范围扫描,唯一索引扫描,常数引用等。
索引的功能就是让mysql以扫描最少的方式找到需要的记录。
eg.如果使用了索引,type=ref可能只需要访问10行数据,而如果不使用则需要使用全表的行数。

where的实现方式:性能从高到低

  • 在聚簇索引中使用where条件来过滤不匹配的记录,这是在存储引擎层面实现的。
  • 使用索引返回覆盖索引记录,在覆盖索引记录中过滤不需要的记录并且返回命中的结果。这是在MYSQL服务器层实现的,无需回表。(Extra:Using index)
  • 在mysql服务器层面,读出记录然后过滤。(Extra:using where)

优化where

  • 使用覆盖索引,避免回表

临时表

临时表的生命周期通常仅限于当前会话,因此在会话结束后会自动删除。
修改临时表不会影响原表。这是因为临时表在数据库中是独立存在的,具有自己的数据和结构,和原表没有直接关联。

  1. 当查询包含 GROUP BY 和 ORDER BY,(或只包含ORDERBY),且两者的列不同时,MySQL通常会创建一个临时表来对结果进行排序和分组。
  2. 在某些复杂的 DISTINCT 查询中,MySQL可能会创建临时表来帮助消除重复行。
  3. 当使用 UNION 或 UNION ALL 将多个查询结果合并时,MySQL会使用临时表来存储中间结果,然后进行去重或合并操作。
  4. 子查询
  5. 主动创建
  6. 复杂查询

分解联级查询

分解联级查询的一个重要基础就是将复杂查询中的子查询结果缓存起来,然后在后续的查询中使用这些中间结果。

步骤:
  1. 识别子查询:找出联级查询中的子查询。
  2. 提取子查询为独立查询:将每个子查询提取出来,作为独立的查询执行。
  3. 使用临时表或CTE(Common Table Expressions)缓存结果:将子查询的结果存储在临时表或CTE中。
  4. 在主查询中使用缓存的结果:在主查询中引用这些缓存的结果,简化原始查询。

sql关键字执行顺序

FROM:首先处理的是 FROM 子句,它决定了查询要处理的数据源。此步骤包括连接操作(JOIN)。
WHERE:接下来处理 WHERE 子句,用于过滤从 FROM 子句中选择的行。
GROUP BY:然后是 GROUP BY 子句,它将选择的行分组。
HAVING:接下来处理 HAVING 子句,对 GROUP BY 分组后的结果进行过滤。
SELECT:然后处理 SELECT 子句,确定要返回的列。
DISTINCT:如果使用了 DISTINCT 关键字,这一步会去除重复行。
ORDER BY:最后处理 ORDER BY 子句,对结果进行排序。
LIMIT:最后是 LIMIT 子句,用于限制返回的行数。

查询执行的基础

连接池-服务器-解析器-预处理器-优化器-存储引擎。

预估并且转换为常数表达式

mysql如何执行联级查询

mysql认为每一个查询都是join查询。

UNION执行:一个放在临时表,然后join

两层for循环,拿每一个外层行去匹配内层所有行。
在mysql8以后不再使用,而是使用hash的join。

join:小表驱动大表

减少扫描次数:因为小表先扫描并连接,减少了大表的扫描和连接次数。

排序优化

filesort:数据量小在内存,数据量大在磁盘。
需要创建临时表。
将所用到的列都放到内存,然后排序,返回需要返回的列。

特定的类型的优化

优化count()

select count(color = ‘blue’ or null) as blue,count(color = ‘red’ or null) as red from items;

优化join查询

  • 在on列上建立索引,通常是for联级内层的表需要建立:B,A:在A上建立
  • 确保联级操作中的groupby和orderby只使用一个表中的索引,这样才能使用这个索引b加树。

优化limit和offset子句

当执行,order by id limit 10000,20这样的操作时,会访问10020行才返回20行。因为需要排序,会加载一个临时表。
这个语句主要的问题就是offset:10000

使用上一次查找获得的位置

where id > offset的位置 limit 20

使用覆盖索引

减少回表

延迟关联
SELECT *
FROM large_table
WHERE id IN (SELECT id FROM large_tableORDER BY some_columnLIMIT 10000, 20
);

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

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

相关文章

第13章 层次式架构设计理论与实践

层次式架构的核心思想是将系统组成为一种层次结构,每一层为上层服务,并作为下层客户。其实不管是分层还是其他的架构都是为了解耦,更好的复用,只要秉承着这种思想去理解一切都迎刃而解了。 13.1 层次上体系结构概述 回顾一下软件…

什么是Linux?Linux与windows的区别

说到电脑系统 我想有大多数人会脱口而出:windows、mac 是的,这也是如今市场上主流的两种操作系统。 但是对于IT相关的人士来说,还有一种系统也是必须有姓名 那就是Linux 今天我们就来为一些行业新手或是小白来科普一下,什么是…

【uniapp】uniapp页面介绍

目录 开发工具:HBuilderX介绍特点和功能 页面简介页面管理新建页面删除页面页面改名pages.json 设置应用首页 页面内容构成template模板区script 脚本区export default 外的代码export default 里的代码 style样式区 页面生命周期Vue2 页面及组件生命周期流程图Vue3…

重生奇迹MU剑士两把单手剑

重生奇迹mu觉醒剑士在武器的选择上非常广泛,可以单手操作也可以双手,那么许多玩家觉得单手剑特别帅气,能否装备两个单手剑,感兴趣的玩家一起来看看详情介绍。 单手剑是一个单手武器,你可以选择装备一个单手剑&#xf…

力扣283题:移动零(快慢指针)

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0]示例 2: 输入: nums [0] 输出: [0…

13.Redis之数据库管理redis客户端JAVA客户端

1.数据库管理 mysql 中有一个重要的概念,database 1个 mysql 服务器上可以有很多个 database1个 database 上可以有很多个 表mysql 上可以随心所欲的 创建/删除 数据库~~ Redis 提供了⼏个⾯向 Redis 数据库的操作,分别是 dbsize、select、flushdb、flushall 命令…

Yii 结合MPDF 给PDF文件添加多行水印

首先确保安装了mpdf扩展 composer require mpdf/mpdf public function createWaterPdf($file_path,$water_text){date_default_timezone_set(PRC);ini_set(memory_limit, 6400M);ini_set(max_execution_time, 0);try{$mpdf new Mpdf();$pageCount $mpdf->SetSourceFile…

在 GPT-4o 释放完整能力前,听听实时多模态 AI 创业者的一手经验 | 编码人声

「编码人声」是由「RTE开发者社区」策划的一档播客节目,关注行业发展变革、开发者职涯发展、技术突破以及创业创新,由开发者来分享开发者眼中的工作与生活。 5 月中旬 GPT-4o 的发布,让人与 AI 的交互,从对话框的文本交流加速推进…

去除uni微信小程序button的边框

想要去除button的边框,如下未去除边框时,非常影响观感。 解决方法 使用伪元素::after,简单但是易忘,正常情况下,我直接是给button上加上一个类名直接设置border:none,但是这样是无效的,应该如下…

前端canvas实现图片涂鸦(Vue2、Vue3都支持)

先看一下效果图吧 代码组成&#xff1a;画笔大小、颜色、工具按钮都是组件&#xff0c;通俗易懂&#xff0c;可以按照自己的需求调整。 主要代码App.vue <template><div class"page"><div class"main"><div id"canvas_panel&qu…

Codeforces Round 803 (Div. 2) C. 3SUM Closure (数学模拟 + 暴力枚举)

给你一个长度为 n 的数组 a 。如果对于所有不同的索引 i &#xff0c; j &#xff0c; k &#xff0c;和 aiajak 都是数组的元素&#xff0c;那么这个数组称为 3SUM 闭合数组。更正式地说&#xff0c;如果对于所有整数 1≤i<j<k≤n 存在某个整数 1≤l≤n 使得 aiajakal 是…

动态规划part01 Day41

动态规划算法解题步骤 确定dp数组&#xff08;dp table&#xff09;以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组 LC509斐波那契数 LC70爬楼梯 LC746使用最小花费爬楼梯 dp[]含义&#xff1a;爬到第i层楼梯的最小花费

梯度下降、反向传播、激活函数、参数初始化、批量归一化是深度学习中常用的几个概念

梯度下降、反向传播、激活函数、参数初始化、批量归一化是深度学习中常用的几个概念。下面我将对这些概念进行简要的凝练解释&#xff0c;并给出相应的例子。 梯度下降&#xff08;Gradient Descent&#xff09;: 原理: 通过迭代地调整参数&#xff0c;使得损失函数的值最小化…

B站尚硅谷git学习记录

文章目录 一、Git概述1.何为版本控制2.为什么需要版本控制3.版本控制工具 二、Git常用命令1.设置用户签名1.1 基本语法1.2 案例实操 2.初始化本地库2.1 基本语法2.2 案例实操 3.查看本地库状态3.1基本语法3.2 案例实操&#xff08;1&#xff09;首次查看&#xff08;工作区没有…

前端面试题01-11

面试题解答 1. ES5、ES6和ES2015有什么区别? ECMAScript是JavaScript的标准&#xff0c;每隔几年就会发布新的版本。ES5、ES6和ES2015都是这个标准的一部分。 ES5&#xff08;ECMAScript 5&#xff09;&#xff1a;发布于2009年&#xff0c;是对之前版本的重大更新&#xf…

TinyEngine 低代码引擎:带你5分钟高效构建游戏登录界面

本文由体验技术团队 TinyEngine 项目成员李旭宏创作&#xff0c;欢迎大家实操体验&#xff0c;本体验项目基于 TinyEngine 低代码引擎提供的环境&#xff0c;通过体验简单拖、拉、拽的形式帮助开发者快速了解低代码引擎的使用流程&#xff0c;达到快速开发游戏登录界面的效果。…

143.栈和队列:用队列实现栈(力扣)

题目描述 代码解决 class MyStack { public:queue<int> que; // 定义一个队列用于实现栈// 构造函数&#xff0c;初始化队列MyStack() {}// 向栈中推入元素 xvoid push(int x) {que.push(x); // 使用队列的 push 方法将元素 x 添加到队列尾部}// 从栈中弹出并返回栈顶元…

【MIT 6.5840(6.824)学习笔记】GFS

1 分布式存储系统难点 在设计大型分布式系统或存储系统时&#xff0c;初衷通常是为了获得显著的性能提升&#xff0c;通过数百台计算机的资源来并行完成大量工作。因此&#xff0c;性能问题成为最初的关注点。一个自然的想法是将数据分片&#xff08;Sharding&#xff09;&…

《数字图像处理》笔记/期末复习资料

目录 1 简述二值图像、灰度图像与彩色图像间的区别。 2 图像量化时&#xff0c;如果量化级比较小会出现什么现象&#xff1f;为什么&#xff1f; 3 图像增强的目的是什么&#xff1f; 4 什么是中值滤波&#xff0c;有何特点&#xff1f; 5 叙述高通滤波、低通滤波、带通滤…

区块链技术引领:Web3时代的新网络革命

随着区块链技术的快速发展和不断成熟&#xff0c;人们已经开始意识到它所带来的潜在影响&#xff0c;尤其是在构建一个更加去中心化、安全和透明的互联网时。这个新的互联网时代被称为Web3&#xff0c;它将不再受制于传统的中心化平台&#xff0c;而是更多地依赖于去中心化的网…