当前位置: 首页 > 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…...

避开这5个坑,你的YOLO模型训练效率翻倍:从yaml配置到GPU显存优化实战

YOLO模型训练效率翻倍的5个关键避坑指南&#xff1a;从参数调优到显存管理实战 当你第一次用YOLOv10或v11跑通训练流程时&#xff0c;可能会觉得"不过如此"。但真正投入实战后&#xff0c;90%的开发者都会遇到显存爆炸、训练龟速、指标波动三大噩梦。上周有位使用RTX…...

影刀+即刻:碎片化信息自动归类的联动玩法

影刀与即刻联动实现信息自动归类影刀RPA作为自动化工具&#xff0c;与即刻APP的推送功能结合&#xff0c;可高效管理碎片化信息。以下为具体实现方法&#xff1a;创建即刻机器人 在即刻APP中创建自定义机器人&#xff0c;设置关键词触发规则。例如设置"#工作""#…...

[具身智能-190]:具身智能常见的仿真平台与常见的模型算法,包括传统算法与AI算法。

在具身智能的开发中&#xff0c;仿真平台与模型算法是相辅相成的两个核心部分。仿真平台为算法提供了安全、高效、低成本的“练兵场”&#xff0c;而算法则是赋予机器人智能的“大脑”。以下为你梳理当前主流的仿真平台以及两类核心的模型算法&#xff1a;传统算法与AI算法。&a…...

抖音下载器:从零开始,轻松获取无水印视频的完整指南

抖音下载器&#xff1a;从零开始&#xff0c;轻松获取无水印视频的完整指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallb…...

私域数据安全与合规——企微引流必须注意的5个技术红线

做公域引流到企微&#xff0c;数据安全和合规是技术团队必须重视的问题。一旦踩红线&#xff0c;轻则功能受限&#xff0c;重则企微封禁甚至法律风险。今天梳理5个技术红线及应对方案。红线1&#xff1a;用户隐私数据存储企微API返回的用户信息包含ExternalUserID&#xff08;外…...

万象视界灵坛基础教程:PyTorch+Transformers环境搭建与CLIP零样本推理入门

万象视界灵坛基础教程&#xff1a;PyTorchTransformers环境搭建与CLIP零样本推理入门 1. 环境准备与快速部署 1.1 系统要求 Python 3.8或更高版本支持CUDA的NVIDIA GPU&#xff08;推荐&#xff09;至少8GB显存&#xff08;CLIP-ViT-L/14模型需求&#xff09;10GB以上可用磁…...

皇后大学揭秘:AI机器人与人类程序员的代码审查大作战

当你写完一段代码&#xff0c;准备提交到项目中时&#xff0c;通常会有同事帮你检查一遍——这个过程叫做代码审查&#xff0c;就像文章发表前的编辑校对一样重要。不过现在情况有了变化&#xff1a;越来越多的AI机器人也开始参与代码审查工作&#xff0c;它们能自动发现bug、提…...

payload-dumper-go实战案例:解决Android系统更新提取难题

payload-dumper-go实战案例&#xff1a;解决Android系统更新提取难题 【免费下载链接】payload-dumper-go an android OTA payload dumper written in Go 项目地址: https://gitcode.com/gh_mirrors/pa/payload-dumper-go Android系统更新通常以OTA&#xff08;Over-the…...

Qwen2.5-14B-Instruct开源大模型实战:像素剧本圣殿8-Bit UI部署详解

Qwen2.5-14B-Instruct开源大模型实战&#xff1a;像素剧本圣殿8-Bit UI部署详解 1. 项目概览 像素剧本圣殿&#xff08;Pixel Script Temple&#xff09;是一款基于Qwen2.5-14B-Instruct大模型深度微调的专业剧本创作工具。这个独特的创作环境将强大的AI推理能力与复古8-Bit视…...

Streamlit像素UI深度优化教程:解决Ostrakon-VL终端文字遮挡问题

Streamlit像素UI深度优化教程&#xff1a;解决Ostrakon-VL终端文字遮挡问题 1. 项目背景与问题分析 在开发Ostrakon-VL零售扫描终端时&#xff0c;我们选择了一种独特的像素艺术风格UI设计。这种高饱和度的8-bit复古游戏美学虽然提升了用户体验的趣味性&#xff0c;但也带来了…...