MySQL语句优化

2023-10-31



1、MySQL的执行顺序

  1. from 如果有笛卡尔积就会和另外一张表生成中间表Temp1
  2. on 筛选关联表符合表达式的数据,由Temp1生成Temp2
  3. where 过滤不符合条件的数据
  4. group by 分组
  5. having 对分组后的记录进行聚合
  6. select 属性筛选
  7. distinct 去重
  8. order by 排序
  9. limit 限制返回记录

2、基础SQL优化

2.1建表优化

使用varchar代替char

例:

#正例
 create table course(cname varchar(50));
#反例
 create table course(cname char(50));

理由:

  • varchar变长字段按数据内容实际长度存储,存储空间小,可以节省存储空间
  • char按声明大小存储,不足补空格
  • 其次对于查询来说,在一个相对较小的字段内搜索,效率更高
使用数值代替字符串类型
  • 主键(id):primary key优先使用数值类型如int
  • 性别(sex):0-代表女,1-代表男;
字段设置为not null

​ 尽量把字段设置为NOT NULL,这样在将来执行查询的时候,数据库不用去比较NULL值。

批量插入性能提升
INSERT INTO student (id,name) VALUES(1,'lyf'),(2,'lyc');
  • 默认新增SQL有事务控制,导致每条都需要事务开启和事务提交;而批量处理是一次事务开启和提交。

2.2查询优化

select 具体字段
#正例
SELECT id,name FROM stu
#反例
SELECT * FROM stu
  • 只取需要的字段,节省资源
  • select * 查询时,可能不会用到索引,造成全表扫描
避免在where子句中使用or来连接条件
#正例
SELECT id,name FROM stu where id=1
SELECT id,name FROM stu where age=18
#反例
SELECT id,name FROM stu where age=18 or id=1
  • 使用or可能会使索引失效,从而全表扫描
  • 对于or没有索引的这种情况,假设它走了id的索引,但是走到查询条件时,它还得全表扫描。也就是说整个过程需要三步:全表扫描+索引扫描+合并。如果它一开始就走全表扫描,直接一遍扫描就搞定。虽然mysql是有优化器的,处于效率与成本考虑,遇到or条件,索引还是可能失效的
连续查询尽量用between

​ 在连续数值的查询中,能使用between的情况下,尽量使用between,而不使用in。in和not in可能会导致全表查询。

多表查询用join

多表查询数据,使用inner join,left/right join来代替子查询。因为子查询需要在内存中创建临时表来完成这个逻辑上的需要两个步骤的查询工作。

使用like时能用只用一个%就不建议用%%

​ 双%查询会导致mysql引擎放弃使用索引而进行全表扫描查询,查询时尽量把%放后面,或者不适用%。

精确属性类型匹配

​ 例如:select id from user where id=‘3’;如果id 建立的varchar类型的走索引,如果写成select id from user where id=3不走索引。

使用limit限制返回记录数

​ 如果查询返回数据量很大,就会造成查询时间过长,网络传输时间过长。同时大量数据返回可能没有实际意义。如返回上千条甚至更多,用户也看不过来。就可以用limit进行分页。

不要有超过5个以上的表连接
  • 关联的表个数越多,编译的时间越大
  • 每次关联内存中都生成一个临时表
  • 应该把连接表拆开成较小的几个执行,可读性更高
  • 阿里规范中,建议多表联查三张表以下
inner 、left 、right join,优先使用inner join

三种连接如果结果相同,优先使用inner join,如果使用left join左边表尽量小

  • inner join是等值连接,返回的行数比较少,所以性能相对会好一点
  • 使用左连接,左边表数据结果尽量小,条件尽量放到左边处理,意味着返回的行数可能比较少。这是mysql优化原则,就是小表驱动大表,小的数据集驱动大的数据集,从而让性能更优
尽量使用union all替代union
SELECT * FROM ...
UNION ALL
SELECT * FROM ...
  • union和union all的区别是,union会自动去掉多个结果集合中的重复结果,而union all则将所有的结果全部显示出来,不管是不是重复
  • union:对两个结果集进行并集操作,去重不包括重复行,相当于distinct,同时进行默认规则的排序
先过滤再分组
select id,sex from stu 
where 表达式
group by sex;
  • 把不需要的记录过滤掉再分组
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL语句优化 的相关文章

随机推荐

  • pt-online-schema-change添加索引没有反应

    之前使用 pt online schema change添加索引没有问题 如下语句 root ixxxxxx pt online schema change no version check execute alter foreign ke
  • WSL使用技巧 / 虚拟机对比

    WSL使用技巧 虚拟机对比 前言 虚拟机比较 VMware使用技巧 WSL使用技巧 官方文档 工具 安装WSL 基本命令 运行命令 关闭卸载 磁盘管理 导入导出 指定安装路径 前言 本文介绍了VMware和WSL的区别 并详细介绍了WSL的
  • C++中的栈和堆

    由C C 编译的程序占用的内存分为以下几个部分 1 栈区 stack 又编译器自动分配释放 存放函数的参数值 局部变量的值等 其操作方式类似于数据结构的栈 2 堆区 heap 一般是由程序员分配释放 若程序员不释放的话 程序结束时可能由OS
  • linux服务器监控谁改了文件,linux服务器文件监控

    linux服务器文件监控 内容精选 换一换 cd opt dis agent X X X logstail 100f dis agent log显示如下信息 表示Agent正常运行 Agent Startup completed in xx
  • Django简介(二)

    Models 通常 一个model对应数据库的一张数据表 Django中Models以类的形式表现 它包含了一些基本字段以及数据的一些行为 Django将与数据库交互的SQL语句封装起来 而无需开发人员再次编写 ORM object rel
  • vite创建vue3项目方式

    快速创建方式 终端输入 npm init vite latest 然后输入项目名称 选择要创建的框架版本 然后选择需要的脚本语言 最后 npm i初始化 npm run dev启动项目 项目目录如下 页面展示
  • Vue 保存cookie信息 ,用Vue开发完成后使用Hbuilder打包apk 保存登录信息到cookie中

    以下是在vue2开发过程中 保存登录信息时 使用电脑浏览器能获取cookie 但使用Hbuilder打包apk文件时获取不到cookie值的解决办法 第一步 安装 npm install js cookie 如已安装直接忽略 第二步 使用
  • vue.js执行if语句后程序终止甚至后面的else语句也不会执行

    今天因为前端 vue 的一个问题 耽误了几个小时 本想使用if this sciEngineeringChartData 0 0 id null 进行条件判断 但是程序执行到这里后就不再执行了 本来预想着if语句里面的条件不成立会执行els
  • Java解析zip文件,并识别压缩包里面的文件转换成可操作的IO流

    前几天项目遇到一个棘手的问题 批量上传人员的证件照 因为java操作文件夹不好操作 最后决定把存放人员证件照的文件夹压缩成zip文件 通过java去解析 然后把里面的文件转成list集合 这里使用的jdk提供的 java util zip包
  • Python3链接HIVE

    几个必要的pip 如果用anaconda 安装pyhive的时候会附带都给安装上 pip install pyhive pip install thrift pip install sasl pip install thrift compi
  • PyQt输入部件:QKeySequenceEdit快捷键输入部件简介和使用案例

    PyQt输入部件 QKeySequenceEdit快捷键输入部件简介和使用案例 QKeySequenceEdit是PyQt中的一个输入部件 用于接受用户输入的快捷键序列 它提供了一个用户友好的界面 允许用户直接按下键盘上的按键来定义快捷键
  • python web开发笔记--如何采用uwsgi来部署你的Django项目

    接上一文 python web开发笔记 MAC上Django uwsgi构建总结 最近对于采用uwsgi进行成功部署自己的项目已经成功搞定 因此写下这篇博客 这绝对是一篇值得需要的人读的用心好博文 废话不多少 开始正题 1 进入你的项目目录
  • 阿里云STS获取临时授权

    获取阿里云oss授权 public function sts url https sts aliyuncs com action AssumeRole RoleArn rolearn RoleSessionName client Durat
  • STM32-FreeRTOS源码下载及移植步骤(基于Keil)

    FreeROTS源码获取及基于Stm32移植 获取源码 其实找资料没有那么复杂 官网就是最好的地方了 FreeRTOS的官网是 FreeRTOS官网 当然了 这个网站是全英文的 不过没关系 我们可以简单了解一下 如下图 在这个网页里点击左侧
  • 快速安装最新版Burp Suite Professional

    官网下载链接 https portswigger net burp releases JDK 官方下载 https www oracle com java technologies downloads jdk19 windows 一路默认安
  • 文件的流

    一 文件名词解释 文件 是存贮在某种介质上的 如磁盘 磁带等 并具有文件名的一组有序信息的集合 流设备 大多数的字符设备 如键盘 打印机等 传输的信息均由 一组顺序出现的字符序列组成 文件系统 操作系统对系统的软件资源 不论是应用软件和系统
  • IDEA 项目突然出现异常无法启动时的有效解决办法 ...

    解决方法有效的前提是 项目本身是可以正常启动的 但是因为某些原因无法正常启动 原因包括但不限于以下几种 不小心删除了项目中的文件 导致无法启动 项目很久没更新 更新之后 导致无法启动 项目更新之后出现很多报错信息 导致无法启动 通常做法 根
  • 抖音、快手、B站的广告投放原理

    抖音 快手 B站的广告投放原理 文章目录 抖音 快手 B站的广告投放原理 TOC 文章目录 广告投放原理 编者按 本文来自微信公众号 鸟哥笔记 ID niaoge8 节选自 信息流广告入门 作者 宁阿姨 作者写的挺到位的 相互学习 共同进步
  • Unity网络编程之Photon Server(四)

    前言 上篇我们学习了Unity客户端如何和Photon服务器建立连接 这篇是如何与服务器进行数据的交互 惯例 基于上篇的服务器项目MyGameServer Unity客户端项目进行进一步的学习 客户端与服务器交互流程图解 前面我们有谈到 当
  • MySQL语句优化

    文章目录 1 MySQL的执行顺序 2 基础SQL优化 2 1建表优化 使用varchar代替char 使用 数值 代替 字符串 类型 字段设置为not null 批量插入性能提升 2 2查询优化 select 具体字段 避免在where子