mysql的慢sql优化

2023-11-10

慢sql优化

  • 优化慢sql,最常见的就是添加索引。
  • 查询语句中不要使用select *
  • 尽量减少子查询,使用关联查询(left join,right join,inner join)替代
  • 减少使用IN或者NOT IN ,使用exists,not exists或者关联查询语句替代
  • or 的查询尽量用 union或者union all 代替(在确认没有重复数据或者不用剔除重复数据时,union all会更好)
  • 应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
  • 应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:
    select id from t where num is null
    可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:
    select id from t where num=0
  • 对于like查询,”%”不要放在前面。
SELECT * FROM  t_order  WHERE uname LIKE '编程%' -- 走索引 
    SELECT * FROM  t_order  WHERE uname LIKE  '%编程%' -- 不走索引

可以用instr代替左模糊。

instr(title,'name')>0  相当于  title like '%name%' 
instr(title,'name')=1  相当于  title like 'name%' 
instr(title,'name')=0  相当于  title not like '%name%'

EXPLAIN查看执行计划

EXPLAIN可以查看执行计划,对 SELECT 语句进行分析,并输出 SELECT 执行的详细信息,方便针对性地优化。
查询结果的字段如下:

select_type: SELECT 查询的类型。包括SIMPLE、PRIMARY、UNION、UNION RESULT等
    table: 查询的是哪个表
    partitions: 匹配的分区
    type(重要): 类型。type值为all,表示全表扫描。type值为const,说明使用了主键索引。

system: 表中只有一条数据. 这个类型是特殊的 const 类型.

const: 针对主键或唯一索引的等值查询扫描, 最多只返回一行数据. const 查询速度非常快, 因为它仅仅读取一次即可.

eq_ref: 此类型通常出现在多表的 join 查询, 表示对于前表的每一个结果, 都只能匹配到后表的一行结果. 并且查询的比较操作通常是 =, 查询效率较高.

ref: 此类型通常出现在多表的 join 查询, 针对于非唯一或非主键索引, 或者是使用了 最左前缀 规则索引的查询.

range: 表示使用索引范围查询, 通过索引字段范围获取表中部分数据记录. 这个类型通常出现在 =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, IN() 操作中.
当 type 是 range 时, 那么 EXPLAIN 输出的 ref 字段为 NULL, 并且 key_len 字段是此次查询中使用到的索引的最长的那个.

index: 表示全索引扫描(full index scan), 和 ALL 类型类似, 只不过 ALL 类型是全表扫描, 而 index 类型则仅仅扫描所有的索引, 而不扫描数据.
index 类型通常出现在: 所要查询的数据直接在索引树中就可以获取到, 而不需要扫描数据. 当是这种情况时, extra 字段 会显示 Using index.

all: 表示全表扫描, 这个类型的查询是性能最差的查询之一. 通常来说, 我们的查询不应该出现 ALL 类型的查询, 因为这样的查询在数据量大的情况下, 对数据库的性能是巨大的灾难. 如一个查询是 ALL 类型查询, 那么一般来说可以对相应的字段添加索引来避免.

不同的 type 类型的性能关系如下:
ALL < index < range ~ index_merge < ref < eq_ref < const < system。

possible_keys: 此次查询中可能选用的索引
    key(重要): 此次查询中确切使用到的索引.
    ref: 哪个字段或常数与 key 一起被使用
    rows(重要): 显示此查询一共扫描了多少行. 这个是一个估计值.
    filtered: 表示此查询条件所过滤的数据的百分比
    extra: 额外信息,比如using index表示使用覆盖索引,using where表示在存储引擎之后进行过滤,using temporary表示使用临时表,using filesort表示对结果进行外部排序。

技术角度

  • 用EXPLAIN 查看执行计划。
  • 拆解sql,复杂的sql拆成多条sql,再用 java代码拼接。
  • 复杂的sql,在上线之前,先去生产环境 EXPLAIN 一下执行计划。

业务角度

  • 与产品/业务讨论,查询时,能否限制时间范围,比如只查七天、只查一个月。
  • 与产品/业务讨论,能否清理无用的旧数据,只保留最近三个月、最近一年的数据。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mysql的慢sql优化 的相关文章

  • 金融 - 计算到期收益率

    我读了this https stackoverflow com questions 1173555 open source financial library specifically yield to maturity发布关于 net 库
  • sql查询中case语句中的布尔值

    我在选择查询中使用 case 语句 类似这样 Select col1 col2 isActive case when col3 abc then 1 else 0 end col4 from
  • 从 SQL Server 中的子查询值或其他聚合函数获取平均值

    我有 SQL 语句 SQL Server SELECT COUNT ActionName AS pageCount FROM tbl 22 Benchmark WHERE DATEPART dw CreationDate gt 1 AND
  • Delphi XE5 FireDAC 错误:无法加载供应商库 [libmysql.dll 或 libmysqld.dll]

    我在 Windows 7 64 位上使用 Delphi XE5 只是尝试 FireDAC 组件 我正在使用一个 TFDConnection 组件连接到本地 MySQL 数据库 v5 6 15 我已经将 libmysql dll 32位 v5
  • Oracle中如何选择前100行?

    我的要求是获取每个客户的最新订单 然后获取前100条记录 我编写了一个如下查询来获取每个客户的最新订单 内部查询工作正常 但我不知道如何根据结果获得前 100 名 SELECT FROM SELECT id client id ROW NU
  • 如何使用 Alter Table 在 Access 中创建小数字段?

    我想以编程方式在 MS Access 表中创建一个新列 我尝试过很多排列ALTER TABLE MyTable Add MyField DECIMAL 9 4 NULL 并得到 字段定义中的语法错误 我可以轻松创建一个数字字段Double类
  • MyBatis 枚举的使用

    我知道以前有人问过这个问题 但我无法根据迄今为止找到的信息实施解决方案 所以也许有人可以向我解释一下 我有一个表 状态 它有两列 id 和 name id是PK 我不想使用 POJO Status 而是使用枚举 我创建了这样一个枚举 如下所
  • 如何从连接字符串中提取数据库名称,而不考虑 RDBMS?

    我正在研究一个不知道正在使用的 RDBMS 的课程 当然 应用程序的其余部分都清楚这一点 连接字符串是此类的输入 我需要数据库名称 无论 RDBMS 如何 如何从连接字符串中提取数据库名称 我读到以下问题 如何使用 SqlConnectio
  • TSQL:无法对 COUNT(*) 执行聚合函数 AVG 来查找一天中最繁忙的时间

    考虑一个保存日志数据的 SQL Server 表 重要的部分是 CREATE TABLE dbo CustomerLog ID int IDENTITY 1 1 NOT NULL CustID int NOT NULL VisitDate
  • 通过 PDO 将双精度数插入 MySQL 时精度损失

    我遇到了这种非常烦人的行为 我想知道我是否做错了什么 或者这是否是故意的 如果是的话 为什么 每当我在 php 5 3 中有一个 double 类型的变量 并且想将其插入到数据库 MYSQL 5 0 的 double 类型字段中时 该值总是
  • 如何处理PDO异常[重复]

    这个问题在这里已经有答案了 我正在尝试与PDOphp 上的类 但我在找到处理错误的正确方法时遇到了一些麻烦 我编写了以下代码
  • Symfony/Doctrine 重新排列数据库列

    当我使用doctrine schema update命令行生成表时 Doctrine 或Symfony 似乎想要添加一个命令来重新排列我的列 将键放在它出现的前面 我想知道是否 更希望在哪里 我可以禁用环境的这个 功能 所以当我去生成我的表
  • MySQL解释更新

    作为我大学复习的一部分 我试图回答以下问题 至少在表的一个属性上创建索引 employees 数据库 您可以在其中使用 MySQL EXPLAIN 工具 清楚地显示好处 在条款或检索方面 和负面 在 更新条款 创建相关索引的信息 对于第一部
  • SQL查询获取最后两条记录的DateDiff

    我有一个名为 Event 的表 其中 eventNum 作为主键 日期作为 SQL Server 2008 R2 中的 datetime2 7 我试图获取表中最后两行的日期并以分钟为单位获取差异 这就是我目前所拥有的 Select DATE
  • 将我的 Laravel 连接到外部数据库

    如何将 Laravel 连接到外部数据库 示例 我的本地计算机上有一个 Laravel 它在 xampp 上运行 我希望它连接到云服务器数据库 打开 env文件并编辑它 只需设置正确的外部数据库凭据 DB CONNECTION mysql
  • 如何将变量设置为触发器 MYSQL 内存储过程的结果?

    我这里有一个小问题 我正在为我的数据库工作创建一个触发器 但我不知道如何在触发器内使用存储过程 我想将过程的结果保存在变量中 然后使用稍后在 IF 比较器上变量 这是我的代码 DELIMITER CREATE TRIGGER insert
  • MySQL - 从另一个表插入与常量合并的数据

    我有一个包含一些数据的临时表 products temp 并且我有另一个需要将数据插入其中的表 产品 我需要在新记录上手动设置一些常量 例如vendor id 1等 是否可以在一次请求中插入临时表数据和常量 临时产品 product nam
  • MySQL如何从多个表中获取数据

    我正在寻找 php MySQL jquery 的帮助 我有2张桌子 table1表 1 有 4 列 id 标题 desc thumb img tabel2表 2 有 3 列 id 表 id img 我只想将 2 个表与 get QS 的值进
  • SQL Server 标识列值从 0 而不是 1 开始

    我遇到了一个奇怪的情况 数据库中的某些表的 ID 从 0 开始 即使 TABLE CREATE 的 IDENTITY 1 1 也是如此 对于某些表来说是这样 但对于其他表则不然 它一直有效到今天 我尝试过重置身份列 DBCC CHECKID
  • MySqlConnectionStringBuilder - 使用证书连接

    我正在尝试连接到 Google Cloud Sql 这是一个 MySql 解决方案 我能够使用 MySql Workbench 进行连接 我如何使用 C 连接MySqlConnectionStringBuilder 我找不到提供这三个证书的

随机推荐

  • java中JVM的原理

    看过JVM讲解最好的 一 Java虚拟机的生命周期 Java虚拟机的生命周期 一个运行中的Java虚拟机有着一个清晰的任务 执行Java程序 程序开始执行时他才运行 程序结束时他就停止 你在同一台机器上运行三个程序 就会有三个运行中的Jav
  • erpadmin答疑为什么企业有很多“不上ERP等死,上了ERP找死”

    不上ERP等死 上了ERP找死 如何破除这个 魔咒 希望erpadmin总结的如何做好ERP系统实施工作的方法对你有所启发 ERP是建立在信息技术基础上 整合了企业管理理念 业务流程 基础数据 人力物力财力 计算机硬件和软件于一体的企业资源
  • 使用B站API:http://api.bilibili.com/x/space/upstat?mid=2026561407获取播放量、点赞量的返回报文中data数据缺失问题排查(已解决)

    背景 想要用ESP32获取一些b站上的数据粉丝量播放量等数据 获取粉丝数的API http api bilibili com x relation stat vmid 2026561407 获取播放量的API http api bilibi
  • script 标签 async 属性

    script 标签 async 属性 普通script 文档解析的过程中 如果遇到script脚本 就会停止页面的解析进行下载 但是Chrome会做一个优化 如果遇到script脚本 会快速的查看后边有没有需要下载其他资源的 如果有的话 会
  • python-django的JsonResponse返回中文数据编码问题

    JsonResponse res 方法1 直接加这一句即可 json dumps params ensure ascii False return JsonResponse user 王 password 123456 json dumps
  • 一文读懂卷积神经网络CNN(学习笔记)

    来源 机器学习算法与自然语言处理 作者 白雪峰 本文为图文结合 建议阅读10分钟 本文为大家解读如何简单明了的解释卷积 并且分享了学习中的一些方法案例 首先文章的提纲为 CNN栗子镇楼 What is CNN
  • 期货交易大神的分享,有用的策略

    1 每天只做一次 开盘后行情形成后开仓 2 在价格走势很慢的时候进入 开完仓价格朝着不利方向走 就无条件平仓 当天不再做第二次 3 开完仓价格朝着有利的一侧运行后 确认后在开仓价设好止损 通过条件单或闪电手自动止损功能 不再关注行情 收盘之
  • #pragma once用法总结,及与 #ifndef方式的区别

    1 pragmaonce这个宏有什么作用 为了避免同一个头文件被包含 include 多次 C C 中有两种宏实现方式 一种是 ifndef方式 另一种是 pragma once方式 在能够支持这两种方式的编译器上 二者并没有太大的区别 但
  • MATLAB 学习笔记(3)MATLAB 矩阵的进阶操作

    目录 MATLAB 矩阵标量操作 实际例子 MATLAB 矩阵的转置 实际例子 MATLAB 串联矩阵 实际例子 MATLAB 矩阵的行列式 MATLAB 逆矩阵 详细例子 MATLAB 矩阵标量操作 标量指的是只有大小没有方向的数 与之相
  • 大学数学竞赛常用不等式_第三届全国大学生数学竞赛初赛(专业组)

    系列传送门 陆艺 第一届全国大学生数学竞赛初赛 专业组 陆艺 第二届全国大学生数学竞赛初赛 专业组 陆艺 第三届全国大学生数学竞赛初赛 专业组 陆艺 第四届全国大学生数学竞赛初赛 专业组 陆艺 第五届全国大学生数学竞赛初赛 专业组 陆艺 第
  • SpringBoot+MyBatis:解决前端上传文件并将url保存到数据库

    前言 最近也是遇到了这个问题 最后成功解决 前期在网上搜索了很多内容 发现都很复杂而且都不尽相同 况且不同的开发软件 不同的配置都会增加我们参考时的麻烦 这里为大家放上了更加简便的方法 开发软件 SpringToolSuite4 个人认为比
  • Allegro如何取消网络高亮

    有时PCB里面不知道为什么有很多网络和焊盘高亮 看着很不协调 想要取消高亮的方法为先点击Dehilight 然后在Options的Dehighligh all里面选择all 如下图 高亮 取消高亮
  • 关于单片机头文件的使用方法

    在单片机的使用中 我们经常会在文件的开始部分进行头文件的定义 即使我们在编写十分简单的LED驱动程序时 往往也引用了头文件 include
  • AttributeError: module ‘time‘ has no attribute ‘clock‘

    报错 AttributeError module time has no attribute clock 原因是 Python3 8 不再支持time clock 但在调用时 非本工程文件CBTaggingDecoder依然包含该方法 修改
  • Spark中json字符串和DataFrame相互转换

    本文介绍基于Spark 2 0 的Json字符串和DataFrame相互转换 json字符串转DataFrame spark提供了将json字符串解析为DF的接口 如果不指定生成的DF的schema 默认spark会先扫码一遍给的json字
  • 【计算机视觉】CVPR 23 新论文

    文章目录 一 导读 二 背景 2 1 主要贡献 2 2 网络介绍 DeSTSeg 三 方法 3 1 Synthetic Anomaly Generation 合成异常生成 3 2 Denoising Student Teacher Netw
  • 子序列的判定算法c语言,求最大子序列的四种算法,数据结构与算法分析(C语言版)第二章...

    File Name maxSubSequence c Author Mail com Created Time 2015年07月18日 19 38 14 Description 求最大子序列的四种算法 数据结构与算法分析 C语言版 第二章
  • UE4材质节点

    材质输入引脚 材质中最为关键的是作为最终输出结果的引脚 根据情况的不同有的会使用 有的并不会被使用 基础颜色 Base Color 定义材质的颜色 接受参数为Vector3 RGB 颜色采用float形式 任何超出范围的输入数值都将被cla
  • 数据结构之线索二叉树详细解释

    1 1 线索二叉树的原理 我们现在倡导节约型社会 一切都应该以节约为本 但当我们创建二叉树时我们会发现其中一共有两个指针域 有的指针域指向的结构为空 这也就浪费了很多空间 所以为了不去浪费这些空间我们采取了一个措施 就是利用那些空地址 存放
  • mysql的慢sql优化

    慢sql优化 优化慢sql 最常见的就是添加索引 查询语句中不要使用select 尽量减少子查询 使用关联查询 left join right join inner join 替代 减少使用IN或者NOT IN 使用exists not e