当前位置: 首页 > news >正文

MySQL 常用优化方式

MySQL 常用优化方式

    • sql 书写顺序与执行顺序
    • SQL设计优化
      • 使用索引
      • 避免索引失效
      • 分析慢查询
      • 合理使用子查询和临时表
      • 列相关使用
    • 日常SQL优化场景
      • limit语句
      • 隐式类型转换
      • 嵌套子查询
      • 混合排序
      • 查询重写

sql 书写顺序与执行顺序

在这里插入图片描述

(7) SELECT
(8) DISTINCT <select_list>
(1) FROM  <main_table>
(3) <join_type> JOIN <join_table>
(2) ON <join_condition>
(4) WHERE <where_condition>
(5) GROUP BY <group_by_list>
(6) HAVING <having_condition>
(9) ORDER BY <order_by_condition>
(10) LIMIT <limit_number>

SQL设计优化

使用索引

  • 确保对经常作为查询条件的列创建索引
  • 对JOIN的列创建索引
  • 但要注意不要过度索引,因为这会减慢写操作(如INSERT、UPDATE、DELETE)

避免索引失效

  • 匹配前缀:如果在WHERE子句中使用LIKE操作符,且匹配模式的开始部分是通配符(例如LIKE ‘%xyz’),将不会使用索引。但如果是’xyz%',则使用索引。
  • 使用函数或表达式:在列上使用函数或表达式(例如WHERE YEAR(column) = 2021)会导致索引失效,因为MySQL无法利用索引直接定位数据
  • OR条件:or表达式两边都必须有索引才会走索引,否则将不会走索引。
    在这里插入图片描述
  • 反向条件不走索引 != 、 <> 、 NOT IN、IS NOT NULL
  • 数据类型不一致,隐式转换(可能)导致索引失效【这点在隐式类型转换中有场景演示】
    在这里插入图片描述

分析慢查询

  • 使用EXPLAIN关键字可以帮助你分析SQL查询的执行计划。通过分析,你可以发现潜在的性能瓶颈,如全表扫描、没有使用索引等问题。

合理使用子查询和临时表

  • 子查询和临时表如果不当使用,会造成性能问题。在可能的情况下,尝试使用JOIN来替代它们。

列相关使用

  • 使用最适合数据的最小数据类型,如INT、VARCHAR等,这可以减少磁盘IO,提高查询效率。

  • 尽量避免使用SELECT *,而是明确指定需要查询的字段。这不仅可以减少数据传输量,还能提高查询效率。

日常SQL优化场景

limit语句

SELECT *
FROM   operation
WHERE  type = 'SQLStats'AND name = 'SlowLog'
ORDER  BY create_time
LIMIT  1000, 10;

在优化上面SQL时,如果数据量特别庞大,除了在type, name, create_time 字段上加组合索引,还可以记录上一次返回列表最后一条数据,以它为开始,优化后(并不会根据数据量的增长而发生变化):

SELECT   *
FROM     operation
WHERE    type = 'SQLStats'
AND      name = 'SlowLog'
AND      create_time > '2017-03-16 14:00:00'
ORDER BY create_time limit 10;

隐式类型转换

隐式转换,就是不带转换类型的转换,当一个字段类型为varchar,但是在判断时SQL是用int去判断,MySQL 就会对这个int进行隐式转换,将其int类型转换为varchar

-- salecode 为varchar类型  
explain select * from my_distribute where salecode=898

在这里插入图片描述
在上述例子中,salecode为varchar类型,其列有索引,但是SQL并没有使用索引,是因为SQL中发生了隐式转换,导致了全表扫描,那是不是所有隐式转换都会使索引失效?

-- address 为int类型  
explain select * from my_distribute where address='22'

在这里插入图片描述
还是同一个表,address类型为int,其列有索引,但是SQL却使用索引[address],以上可知,隐式转换不一定会导致索引失效,而是根据索引的类型变化,如果是数值类型,则右边无论是数值还是字符串都可以走索引,但是我们在开发中,一定要格外注意,避免隐式转换索引失效

嵌套子查询

UPDATE operation o
SET    status = 'applying'
WHERE  o.id IN (SELECT idFROM   (SELECT o.id,o.statusFROM   operation oWHERE  o.group = 123AND o.status NOT IN ( 'done' )ORDER  BY o.parent,o.idLIMIT  1) t);

在这里插入图片描述
上述例子中,更新operation使用了子查询去做过滤,并且使用了in条件,子查询将会在检索operation每一条数据时,都会执行一遍子查询,并将结果集返回判断operation的o.id是否在结果集中,效率非常低下,我们在开发中,也尽量使用join去替代子查询,改良后的sql:

UPDATE operation oJOIN  (SELECT o.id,o.statusFROM   operation oWHERE  o.group = 123AND o.status NOT IN ( 'done' )ORDER  BY o.parent,o.idLIMIT  1) tON o.id = t.id
SET    status = 'applying'

在这里插入图片描述

混合排序

MySQL 不能利用索引进行混合排序。但在某些场景,还是有机会使用特殊方法提升性能的。

SELECT *
FROM   my_order o
INNER JOIN my_appraise a ON a.orderid = o.id
ORDER  BY a.is_reply ASC,a.appraise_time DESC
LIMIT  0, 20

在这里插入图片描述
由于 is_reply 只有0和1两种状态,可以按照下面的方法重写:

SELECT *
FROM   ((SELECT *FROM   my_order oINNER JOIN my_appraise aON a.orderid = o.idAND is_reply = 0ORDER  BY appraise_time DESCLIMIT  0, 20)UNION ALL(SELECT *FROM   my_order oINNER JOIN my_appraise aON a.orderid = o.idAND is_reply = 1ORDER  BY appraise_time DESCLIMIT  0, 20)) t
ORDER  BY  is_reply ASC,appraisetime DESC
LIMIT  20;

使用表子查询,将两个查询结果集UNION ALL 合并结果实现排序

查询重写

 SELECTa.*,c.allocated 
FROM(SELECT resourceid FROM my_distribute d WHERE isdelete = 0 AND cusmanagercode = '22353' ORDER BY salecode LIMIT 20 ) aLEFT JOIN ( SELECT resourcesid, sum( ifnull( allocated, 0 )* 12345 ) allocated FROM my_resources GROUP BY resourcesid ) c ON a.resourceid = c.resourcesid

在这里插入图片描述
以上SQL中因为c表使用了全表聚合,导致了数据全表扫描10w数据,优化后:

SELECTr.resourcesid,sum( ifnull( allocated, 0 ) * 12345 ) allocated 
FROMmy_resources r,( SELECT resourceid, cusmanagercode FROM my_distribute d WHERE isdelete = 0 AND cusmanagercode = '22353' ORDER BY salecode LIMIT 20 ) a 
WHEREr.resourcesid = a.resourceid 
GROUP BYresourceid					

在这里插入图片描述

相关文章:

MySQL 常用优化方式

MySQL 常用优化方式 sql 书写顺序与执行顺序SQL设计优化使用索引避免索引失效分析慢查询合理使用子查询和临时表列相关使用 日常SQL优化场景limit语句隐式类型转换嵌套子查询混合排序查询重写 sql 书写顺序与执行顺序 (7) SELECT (8) DISTINCT <select_list> (1) FROM &…...

算法刷题day22:双指针

目录 引言概念一、牛的学术圈I二、最长连续不重复序列三、数组元素的目标和四、判断子序列五、日志统计六、统计子矩阵 引言 关于这个双指针算法&#xff0c;主要是用来处理枚举子区间的事&#xff0c;时间复杂度从 O ( N 2 ) O(N^2) O(N2) 降为 O ( N ) O(N) O(N) &#xf…...

山人求道篇:八、模型的偏差与交易认知

原文引用https://mp.weixin.qq.com/s/xvxatVseHK62U7aUXS1B4g “ CTA策略一波亏完全年,除了交易执行错误导致的以外,这类策略都是多因子策略,一般会用机器学习组合多因子得出一个信号来进行交易。规则型策略几乎不会出现一波做反亏完全年的情况。这是有以下几个原因的: 多…...

MySQL 元数据锁及问题排查(Metadata Locks MDL)

"元数据"是用来描述数据对象定义的&#xff0c;而元数据锁&#xff08;Metadata Lock MDL&#xff09;即是加在这些定义上。通常我们认为非锁定一致性读&#xff08;简单select&#xff09;是不加锁的&#xff0c;这个是基于表内数据层面&#xff0c;其依然会对表的元…...

JS中的函数

1、函数形参的默认值 JavaScript函数有一个特别的地方&#xff0c;无论在函数定义中声明了多少形参&#xff0c;都可以传入任意数量的参数&#xff0c;也可以在定义函数时添加针对参数数量的处理逻辑&#xff0c;当已定义的形参无对应的传入参数时&#xff0c;为其指定一个默认…...

微信小程序开发常用的布局

在微信小程序开发中&#xff0c;常用的布局主要包括以下几种&#xff1a; Flex 布局&#xff1a;Flex 布局是一种弹性盒子布局&#xff0c;通过设置容器的属性来实现灵活的布局方式。它可以在水平或垂直方向上对子元素进行对齐、排列和分布。Flex 布局非常适用于创建响应式布局…...

Effective C++ 学习笔记 条款10 令operator=返回一个reference to *this

关于赋值&#xff0c;有趣的是你可以把它们写成连锁形式&#xff1a; int x, y, z; x y z 15; // 赋值连锁形式同样有趣的是&#xff0c;赋值采用右结合律&#xff0c;所以上述连锁赋值被解析为&#xff1a; x (y (z 15));这里15先被赋值给z&#xff0c;然后其结果&…...

算法简单试题

一、选择题 01.一个算法应该是( B ). A.程序 B.问题求解步骤的描述 C.要满足五个基本特性 D.A和C 02&#xff0e;某算法的时间复杂度为O(n)&#xff0c;则表示该…...

CSS 自测题 -- 用 flex 布局绘制骰子(一、二、三【含斜三点】、四、五、六点)

一点 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>css flex布局-画骰子</title><sty…...

蓝桥集训之牛的学术圈 I

蓝桥集训之牛的学术圈 I 核心思想&#xff1a;二分 确定指数x后 判断当前c[i]是否>x(满足条件) 并记录次数同时记录 1后满足条件的个数最后取bns和m的最小值 为满足条件的元素个数ansbns为当前指数x下 满足条件的元素个数 #include <iostream>#include <cstring…...

软件设计师软考题目解析21 --每日五题

想说的话&#xff1a;要准备软考了。0.0&#xff0c;其实我是不想考的&#xff0c;但是吧&#xff0c;由于本人已经学完所有知识了&#xff0c;只是被学校的课程给锁在那里了&#xff0c;不然早找工作去了。寻思着反正也无聊&#xff0c;就考个证玩玩。 本人github地址&#xf…...

python读写json文件详解

在Python中&#xff0c;可以使用json模块来读写JSON格式的文件。下面是一个详细的示例&#xff0c;演示了如何读写JSON文件&#xff1a; import json# 写入JSON文件 data {"name": "John","age": 30,"city": "New York" }…...

#include<ros/ros.h>头文件报错

快捷键 ctrl shift B 调用编译&#xff0c;选择:catkin_make:build&#xff09;(要先在vscode上添加扩展&#xff1a;ros) 可以点击配置设置为默认&#xff0c;修改.vscode/tasks.json 文件 修改.vscode/tasks.json 文件&#xff0c;否则ros.h头文件会报错 内容修改为以下内…...

mybatis单表curd笔记(尚硅谷

Mybatis 11111ibatis和mybatis不同 查询文档mybatis的日志输出id赋值输入&#xff08;向sql语句传入数据单个简单类型单个实体对象多个简单类型map类型 输出数据的指定单个简单类型单个实体类型输出map类型输出list输出类型主键回显&#xff08;自增长类型主键回显&#xff08;…...

在线重定义-操作步骤

第一步&#xff1a;验证表是否能被在线重定义 验证是否能按主键重定义&#xff08;默认&#xff0c;最后一次参数可以不加&#xff09; 1 2 3 4 begin --dbms_redefinition.can_redef_table(scott,tb_cablecheck_equipment_bak); dbms_redefinition.can_redef_table(scot…...

16:00面试,16:06就出来了,问的问题过于变态了。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到2月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…...

基于dashscope在线调用千问大模型

前言 dashscope是阿里云大模型服务平台——灵积提供的在线API组件。基于它&#xff0c;无需本地加载大模型&#xff0c;通过在线方式访问云端大模型来完成对话。 申请API key 老规矩&#xff1a;要想访问各家云端大模型&#xff0c;需要先申请API key。 对于阿里云&#x…...

【Python】可变数据类型 不可变数据类型 || hash

&#x1f6a9; WRITE IN FRONT &#x1f6a9; &#x1f50e; 介绍&#xff1a;"謓泽"正在路上朝着"攻城狮"方向"前进四" &#x1f50e;&#x1f3c5; 荣誉&#xff1a;2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2222年获评…...

MySQL 篇-深入了解多表设计、多表查询

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 多表设计概述 1.1 多表设计 - 一对多 1.2 多表设计 - 一对一 1.3 多表设计 - 多对多 2.0 多表查询概述 2.1 多表查询 - 内连接 2.2 多表查询 - 外连接 2.3 多表查…...

【Java】Spring的ReflectionUtils类常用方法学习笔记

目录 ReflectionUtils介绍 常用方法 访问字段 方法调用 处理回调 示例 脑容量不够了&#xff0c;以简单的小知识作为一天的结尾吧(悲 ReflectionUtils介绍 ReflectionUtils是Spring Framework中非常实用的一个工具类&#xff0c;为开发人员提供了简便的反射操作方法&am…...

会议纪要整理不清?如何将会议成果转化为可落地任务

身边不少HR朋友都有过纪要整理的困扰&#xff0c;一场会议或面谈后&#xff0c;花费大量时间整理&#xff0c;最终产出的纪要却零散杂乱&#xff0c;无法提炼可落地的任务&#xff0c;导致会议效果大打折扣。结合半年多的实测体验&#xff0c;整理出一套零基础也能上手的高效方…...

独立开发者如何利用Taotoken以更低成本体验全球主流大模型

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 独立开发者如何利用Taotoken以更低成本体验全球主流大模型 对于预算有限的独立开发者或个人研究者而言&#xff0c;探索不同的大模…...

系统架构设计师-2025年05月综合案例回忆版

试题 试题一(必选题) 某公司开发一个在线大模型训练平台,支持Python代码编写、模型训练和部署,用户通过python编写模型代码,将代码交给系统进行模型代码的解析,最终由系统匹配相应的计算机资源进行输出,用户不需要关心底层硬件平台,在开发该平台架构时,设计了以下质…...

从蓝桥杯嵌入式真题到项目实战:如何把赛题代码改造成一个可配置的电压监控系统?

从竞赛到实战&#xff1a;构建可配置电压监控系统的嵌入式开发指南 参加过蓝桥杯嵌入式竞赛的同学&#xff0c;往往在赛后会有这样的困惑&#xff1a;那些为比赛而写的代码&#xff0c;真的能在实际项目中复用吗&#xff1f;答案当然是肯定的。本文将带你从第十届蓝桥杯嵌入式真…...

从设计到验证:如何用ADS的HB2TonePAE_FPswp模板快速评估你的PA线性度?

射频功放线性度评估实战&#xff1a;ADS高级仿真模板深度解析 在射频功率放大器(PA)的设计流程中&#xff0c;线性度评估往往是最耗时的环节之一。传统方法需要工程师手动搭建测试平台&#xff0c;不仅效率低下&#xff0c;还容易引入人为误差。Keysight ADS软件内置的HB2ToneP…...

别再折腾LaTeX了!用Jupyter Notebook自带功能搞定ipynb转PDF(完美支持中文和公式)

告别复杂工具链&#xff1a;Jupyter Notebook原生方案实现ipynb完美转PDF 在数据分析和学术研究的日常工作中&#xff0c;我们经常需要将Jupyter Notebook&#xff08;.ipynb文件&#xff09;转换为PDF格式以便分享或提交报告。传统方法往往依赖pandoc、LaTeX等复杂工具链&…...

终极指南:如何快速免费解决GBK到UTF-8编码转换难题

终极指南&#xff1a;如何快速免费解决GBK到UTF-8编码转换难题 【免费下载链接】GBKtoUTF-8 To transcode text files from GBK to UTF-8 项目地址: https://gitcode.com/gh_mirrors/gb/GBKtoUTF-8 还在为乱码文件而烦恼吗&#xff1f;GBKtoUTF-8是一款专为中文文本编码…...

传递函数极零点分析:从RC滤波器到系统稳定性设计

1. 从电路到方程&#xff1a;理解传递函数的基石在电子工程&#xff0c;尤其是模拟电路和信号处理领域&#xff0c;我们常常需要精确描述一个系统如何“加工”输入信号。比如&#xff0c;一个简单的RC低通滤波器&#xff0c;它如何让低频信号顺利通过&#xff0c;同时抑制高频噪…...

独立开发者如何借助Taotoken透明计费精细控制多个副业项目成本

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 独立开发者如何借助Taotoken透明计费精细控制多个副业项目成本 对于独立开发者或小型工作室而言&#xff0c;同时维护多个AI驱动的…...

Synopsys ICC 2016环境变量配置详解:从.bashrc编辑到license启动的保姆级步骤

Synopsys ICC 2016环境变量配置全流程实战指南 当你第一次打开Synopsys ICC 2016却遭遇"Command not found"时&#xff0c;90%的问题都源于环境变量配置不当。作为芯片设计领域的工业级工具链&#xff0c;正确的环境配置不仅是运行的先决条件&#xff0c;更是后续所有…...