SQL如何进行优化

2023-11-19

SQL优化

前言

对于初级程序开发工程师而言,SQL是很多人的弱项,为此我给大家来做一下总结,希望能够帮到你们。

课程说明

1、对MySQL SQL优化方案做讲解,学习如何排查慢查询;

SQL优化

分页查询优化

一页一页的往下面翻这种查询方式,可以对分页做如下优化

SELECT `id`,`name` FROM tb_user LIMIT 10000,10; -- 可能存在性能问题
-- 如何 优化?
-- 解决方案,携带上一页的最后一个id
SELECT `id`,`name` FROM tb_user WHERE id > #{last_id} LIMIT 10;

建立索引、使用索引

索引应建立在那些将用于JOIN ON条件、WHERE条件判断、ORDERBY排序的字段上

没有命中索引的SQL不允许执行!

在Java代码中进行条件判断,不允许没有命中索引的SQL执行;

字段能小则小

普通索引不要建立在大字段上

索引建立在离散度大的字段上

批量插入

不要大量使用 insert into,可以使用insert into table (字段) values (),(),();

先导入数据再建立索引

数据迁移的时候

某些情况下避免使用子查询

id in (select id from **) — 10 W

索引字段查询避免使用函数

create_time 就算它是索引, where date_format(create_time,’%Y-%m-%d’) = ‘2019-04-05’ 这个语句也无法命中索引

优化:where create_time >= ‘2019-04-05 00:00:00’ and create_time <= ‘2019-04-05 23:59:59’ 则可以命中索引

禁止排序

如果分组之后没有相关的需求根据那个聚合字段进行排序,则可以加上 order by null 禁止默认排序,提升效率;

group by ** order by null;

建立全文索引替换like模糊匹配

根据词 来 定位 某条数据

表结构

id name introduction(varchar 1024)

1 张三 北京 昌平区 Java 程序员 …

建立全文索引的sql: ALTER TABLE 表名 ADD FULLTEXT INDEX 自定义一个全文索引名称(字段名);

// 备注 也可以在两个列上建立全文索引 —— 够在title和content两个列上创建全文索引

ALTER TABLE article ADD FULLTEXT INDEX fulltext_article(title,content);

我们mysql5.7 InnoDB 它是支持全文索引

我们存储文档时,把需要搜索的关键字 以 空格 或者,或者| 隔开 存储到我们的mysql text / varchar 这种大字段中,对其可以建立全文索引。

避免 使用 like 模糊查询 影响效率。

全文检索的sql

SELECT * FROM tbk_item_coupon WHERE MATCH(title) AGAINST(‘夏季’ IN BOOLEAN MODE);

但是多数情况下,一般会将 mysql数据 同步到 全文搜索服务器 比如 ES 中,提供全文检索功能(分词更加灵活,减轻mysql压力)。

相同类型字段进行比较

比如我们数据库表结果中,某个字段是 varchar 类型

我们 sql 传入的 匹配条件是 Long 类型,那么就算这个varchar 是建立了索引,索引也可能会失效
在这里插入图片描述

EXPLAIN
SELECT * FROM student WHERE `name`= 123;

在这里插入图片描述
在这里插入图片描述

减少锁的独占表的范围

针对某些业务,我们可以在客户端使用 乐观锁的机制,来保证线程安全,可以避免使用 数据库 悲观锁:select *** for update;

乐观锁 : 基于版本 基于 重试。update *** set *** where id = 条件 and version = 我们期待的值;

如何排查慢查询

当我们发现 mysql 从库 数据同步 延迟较高, mysql 服务机器 cpu、内存 使用率 飙升,或者是说一个很简单的sql都没法执行,或者说 远程 客户端都连接不上 mysql服务时,那么 就需要考虑,当前mysql是不是 正在 执行一个慢查询。

show [full] processlist

查看数据库各SQL执行进程情况
在这里插入图片描述
如何强硬终止某个慢查询呢?
在这里插入图片描述

EXPLAIN查看执行计划

我如何知道,我写的SQL会不会是慢查询?难道要跑到线上去执行一下,把线上数据库查崩才能判断我的SQL是慢查询吗?

可以使用执行计划;

mysql在执行每个sql语句前,会先进行分析,统计这个sql大概需要如何去查询,以及扫描的行数,命中的索引,及数据扫描的方式…

通过EXplain 执行 分析报告 查看 当前SQL 是否为 慢查询
在这里插入图片描述
要求,sql执行一定要命中索引,扫描的行数 rows 越小越好。
在这里插入图片描述
ALL:`即全表扫描,意味着mysql需要从头到尾去查找所需要的行。通常情况下这需要增加索引来进行优化了

Extra列

在这里插入图片描述在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL如何进行优化 的相关文章

随机推荐

  • uniapp中开发小程序使用ref获取dom实例,一直显示undefined,竟然发现是这个原因!

    小程序是不能使用getElementById之类的dom api 所以考虑使用ref来获取dom元素 但事实上并不是如此 绑定ref后并没有输出我想要的dom元素 既然console log this refs iRef 为undefine
  • 简单易懂的Git回滚操作(reset、revert)

    简单易懂的Git回滚操作 reset revert 一 问题描述 二 背景知识 git的版本管理 及HEAD的理解 三 解决方法 方法一 git reset 具体操作 方法二 git revert 具体操作 一 问题描述 在利用github
  • 在命令行运行 VSCode(macOS)

    在命令行运行 VSCode macOS系统 Windows 版 VSCode 的安装脚本带着一个是否把 Code 加入 PATH 的选项 而 macOS版却没有 有的人想到给 VSCode 做一个符号链接加入 PATH 中 但实际上这样做会
  • IBM power小型机HMC管理口默认IP地址和ASMI默认密码

    IBM硬件管理控制台 Hardware Management Console 提供了标准的用户接口来配置和管理Power System系列服务器以及服务器上的分区 通过HMC软件可以管理服务器 POWER5 HMC控制地址 192 168
  • HCIP——BGP第一天实验

    一 实验要求 除R5的5 5 5 0环回外 其他所有环回均可互相访问 二 实验拓扑 三 实验过程 1 配置IP地址 R1 r1 int g0 0 1 r1 GigabitEthernet0 0 1 ip add 12 1 1 1 24 r1
  • STM32 电机教程 29 - 无刷无感入门1

    前言 无刷直流 Brushless Direct Current BLDC 电机是一种正快速普及的电机类型 它可在家用电器 汽车 航空航天 消费品 医疗 工业自动化设备和仪器等行业中使用 正如名称指出的那样 BLDC 电机不用电刷来换向 而
  • uvm的config_db

    config db 是用于在各个uvm对象里传递参数 一般参数类型 是interface int等 据说参数必须是静态类型 这个可以在uvm config db相关代码里确认 后来知道 config db还能设置sequence和seque
  • C#如何从数据库SQLServer中同时读取多个结果集

    当需要从数据库中同时读取多个结果集时 比如执行如下的sql语句 select from tblClass select from tblStudent 同时从两个表格中获取结果 会获取两个结果集 此时需要使用SqlDataReader对象的
  • vue使用threejs加载模型问题整理

    1 如果出现错误 THREE WebGLRenderer Error creating WebGL context 需要开启浏览器的gpu加速 GPU acceleration 地址栏输入 chrome flags ignore gpu b
  • 国考省考申论:归纳概括多个主体身上的优秀品质,透过动词现象(怎么做的),找到名词(精神品质)本质

    国考省考申论 归纳概括多个主体身上的优秀品质 透过动词现象 怎么做的 找到名词 精神品质 本质 2022找工作是学历 能力和运气的超强结合体 公务员特招重点就是专业技能 附带行测和申论 而常规国考省考最重要的还是申论和行测 所以大家认真准备
  • dede:list分页与控制文章标题显示字数

    关于dedecms分页 百度上也有许多教程 本人记性不好所以写个博客保存下来 pagesize控制每页显示条数 在 dede list 结束标签 后边写上 dede pagelist 标签即可 如何控制文章显示字 让溢出部分用 代替呢 其实
  • IPS与防火墙旁路部署

    一 防火墙旁路部署 实现防护功能的同时 可以完全不需改变用户的网络环境 并且可以避免设备对用户网络造成中断的风险 用于把设备接在交换机的镜像口或者接在 HUB 上 保证外网用户访问服务器的数据经过此交换机 并且设置镜像口的时候需要同时镜像上
  • iview+page封装+强制刷新

    前言 iview的page封装 缺点无法固定页码按钮数量 而且current的页面恢复选中第一个实现不了 这里动态写了强制刷新的方法 下面是组件cpage vue
  • 【Spring

    上篇 Spring 事件监听概述 对 Spring 事件监听的机制有了个基本的了解 本篇来详细的解读下Spring 的 事件监听机制 事件监听详解 ApplicationEvent ApplicationListener 基于注释 异步 排
  • 多态的实现

    多态 之前介绍过多态的概念就是基类引用派生类对象且和派生类有相同的同名覆盖函数 那么现在我们就具体讲讲怎么实现多态 类方法实现多态性有两种方法 1 方法重载 可以声明多个同名但参数个数 类型 和顺序不同的方法 编译时根据参数 个数 类型和顺
  • win环境下SSH key 配置

    从Gitlab上拉取代码报错 Warning Permanently added gitlab wang cn 47 94 8 13 ECDSA to the list of known hosts Connection closed by
  • windows下使用FFmpeg生成YUV视频文件并播放(通过命令的方式)

    一 YUV的定义 YUV是一种颜色编码方法 它跟我们常见的RGB格式区分开来 常使用在各个视频处理组件中 其中 Y 代表明亮度 U 和 V 代表其色度 视频播放器把市面上流行的MP4等格式文件的视频部分解码出来 得到的一般会是YUV格式的数
  • Java方法重写注意事项

    系原创 只为需要它的人 Java方法重写的几个要求 重写的方法与父类方法签名 方法名称和参数列表 相同 子类重写的方法访问修饰符范围不能低于父类 父类的私有方法不能被重写 static修饰的方法不能被重写 返回值类型 如果父类中方法返回值类
  • 解决mybatis一对多只能获取部分数据的问题

    需求 building表和position表 Building类中含有List positionList mybatis查询方法需要查询到所有的building和building中含有所有的position 问题 sql语句和一对多方法写的
  • SQL如何进行优化

    SQL优化 前言 对于初级程序开发工程师而言 SQL是很多人的弱项 为此我给大家来做一下总结 希望能够帮到你们 课程说明 1 对MySQL SQL优化方案做讲解 学习如何排查慢查询 SQL优化 分页查询优化 一页一页的往下面翻这种查询方式