浅谈MySQL之select优化方案


Posted in MySQL onAugust 07, 2021

生活中的例子

我们是否看到过在公司中许多查询语句都是select * xxxx

心中的想法肯定是,别人写了select *,那我写吧,省去了不少麻烦事儿

慢查询

  • 首先去思考,最基本的,是否我们使用的数据库插查询语句存在了访问的数据太多
  • 其实大部分性能低的查询往往都可以通过减少访问的数据量来优化的
  • 因为select * 会给服务器带来额外的I/O、内存和cpu的消耗

数据库中慢查询开销的三个指标

  • 相应时间
  • 扫描的行数
  • 返回的行数

如果走了索引

select * from stu where id = 1;

索引会优化查询,只返回十条数据
如果没有id索引,那么就会预估访问上百上千行数据

tips: 通过mysql中的EXPLAIN命令去查看的其中rows对应的行数

其实最好的情况就是在存储引擎层过where滤掉不匹配的记录
其次好的情况是覆盖索引命中扫描,在服务器层where滤掉不匹配的记录,不需要回表查询
最的情况是从数据表返回数据,然后再过滤不满足条件的记录

如何去优化

使用索引覆盖,把我们需要的列都放在索引中,这样我们就避免了回表去查询
可以单独分出来表

3.重构查询(可以进行大的查询化解成小的查询)

举例: 如count、limit、max()

count

count 最好的优化就是增加汇总表,因为count不可避免需要扫描大量的行

limit

limit我们在做分页的时候很常用,如下面代码

select id from stu order by id limit 1000,20;

这条语句会查询1020条数据然后丢掉前一千条返回1000~1020的二十条数据
那么优化的最好的方式就是走索引,这样limit查询查就能变成已知位置的查询

最大值最小值min&max

首先我们试想如果走的是主键索引,那么我们去查询的时候第一个的值就是我们要返回的最小值
我们也可以走主键索引以后,用limit去控制数据量,这样就实现了min()函数的效果,从而替换掉min

select id 
from stu 
use index(primay) where address = 'bj' limit 1;

这样就尽可能扫描了少的记录数

最后我们来做两道题放松一下吧

找出`Employee` 表中第二高的薪水(Salary)
+----+--------+
| Id | Salary |
+----+--------+
| 1  | 100    |
| 2  | 200    |
| 3  | 300    |
+----+--------+
结果
+---------------------+
| SecondHighestSalary |
+---------------------+
| 200                 |
+---------------------+
解答

select max(Salary)  SecondHighestSalary
from Employee 
where  salary < (select max(salary)
from Employee)
查找 `Person` 表中所有重复的电子邮箱。
+----+---------+
| Id | Email   |
+----+---------+
| 1  | a@b.com |
| 2  | c@d.com |
| 3  | a@b.com |
+----+---------+

结果

+---------+
| Email   |
+---------+
| a@b.com |
+---------+

解答
select Email from Person 
group by Email 
having count(Email) >= 2;

到此这篇关于浅谈MySQL之select优化方案的文章就介绍到这了,更多相关MySQL select优化内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
MySQL 如何分析查询性能
May 12 MySQL
Mysql Online DDL的使用详解
May 20 MySQL
mysql外连接与内连接查询的不同之处
Jun 03 MySQL
MySQL系列之十二 备份与恢复
Jul 02 MySQL
MySQL基于索引的压力测试的实现
Nov 07 MySQL
MySQL中order by的使用详情
Nov 17 MySQL
Mysql外键约束的创建与删除的使用
Mar 03 MySQL
MySQL高级进阶sql语句总结大全
Mar 16 MySQL
MySQL如何快速创建800w条测试数据表
Mar 17 MySQL
单机多实例部署 MySQL8.0.20
May 15 MySQL
MySQL控制流函数(-if ,elseif,else,case...when)
Jul 07 MySQL
MySQL 原理与优化之Update 优化
Aug 14 MySQL
SQL实现LeetCode(197.上升温度)
Aug 07 #MySQL
SQL实现LeetCode(196.删除重复邮箱)
Aug 07 #MySQL
MySQL Shell import_table数据导入的实现
Aug 07 #MySQL
MySQL配置主从服务器(一主多从)
SQL实现LeetCode(180.连续的数字)
Aug 04 #MySQL
Mysql中where与on的区别及何时使用详析
Aug 04 #MySQL
SQL实现LeetCode(178.分数排行)
Aug 04 #MySQL
You might like
Windows下PHP5和Apache的安装与配置
2006/09/05 PHP
PHP+iFrame实现页面无需刷新的异步文件上传
2014/09/16 PHP
PHP+Apache实现二级域名之间共享cookie的方法
2019/07/24 PHP
如何实现JS函数的重载
2006/09/22 Javascript
jQuery 在光标定位的地方插入文字的插件
2012/05/10 Javascript
JS预览图像将本地图片显示到浏览器上
2013/08/25 Javascript
js实现连续英文字符自动换行兼容ie6 ie7和firefox
2013/09/06 Javascript
jQuery 鼠标经过(hover)事件的延时处理示例
2014/04/14 Javascript
一款由jquery实现的整屏切换特效
2014/09/15 Javascript
20条学习javascript的编程规范的建议
2014/11/28 Javascript
浅谈js中字符和数组一些基本算法题
2016/08/15 Javascript
获取IE浏览器Cookie信息的方法
2017/01/23 Javascript
Bootstrap栅格系统使用方法及页面调整变形的解决方法
2017/03/10 Javascript
原生JS+Canvas实现五子棋游戏实例
2017/06/19 Javascript
layui表格内放置图片,并点击放大的实例
2019/09/10 Javascript
浅谈laytpl 模板空值显示null的解决方法及简单的js表达式
2019/09/19 Javascript
uni-app微信小程序登录并使用vuex存储登录状态的思路详解
2019/11/04 Javascript
vue+ESLint 配置保存 自动格式化代码
2020/03/17 Javascript
在Vue 中实现循环渲染多个相同echarts图表
2020/07/20 Javascript
js实现简单图片拖拽效果
2021/02/22 Javascript
[10:39]DOTA2上海特级锦标赛音乐会纪录片
2016/03/21 DOTA
[05:53]敌法师的金色冠名ID"BurNIng",是传说,是荣耀
2020/07/11 DOTA
Python实现八大排序算法
2016/08/13 Python
python获取当前用户的主目录路径方法(推荐)
2017/01/12 Python
详解如何管理多个Python版本和虚拟环境
2019/05/10 Python
Python变量、数据类型、数据类型转换相关函数用法实例详解
2020/01/09 Python
Python读取VOC中的xml目标框实例
2020/03/10 Python
python音频处理的示例详解
2020/12/23 Python
大学生农村教师实习自我鉴定
2013/09/21 职场文书
篝火晚会主持词
2014/03/25 职场文书
电子信息工程自荐信
2014/05/26 职场文书
高中同学会活动方案
2014/08/14 职场文书
高中数学教学反思范文
2016/02/18 职场文书
PHP连接MSSQL数据库案例,PHPWAMP多个PHP版本连接SQL Server数据库
2021/04/16 PHP
pandas中DataFrame检测重复值的实现
2021/05/26 Python
OpenCV-Python实现人脸磨皮算法
2021/06/07 Python