浅谈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 角色(role)功能介绍
Apr 24 MySQL
详解Mysql和Oracle之间的误区
May 18 MySQL
MySQL大小写敏感的注意事项
May 24 MySQL
Mysql 用户权限管理实现
May 25 MySQL
带你学习MySQL执行计划
May 31 MySQL
MySQL 十大常用字符串函数详解
Jun 30 MySQL
MYSQL 的10大经典优化案例场景实战
Sep 14 MySQL
一次MySQL启动导致的事故实战记录
Sep 15 MySQL
mysql的数据压缩性能对比详情
Nov 07 MySQL
MySQL数据库如何使用Shell进行连接
Apr 12 MySQL
MYSQL常用函数介绍
May 05 MySQL
了解MySQL查询语句执行过程(5大组件)
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
咖啡知识 除了喝咖啡还有那些知识点
2021/03/06 新手入门
让你同时上传 1000 个文件 (一)
2006/10/09 PHP
检查url链接是否已经有参数的php代码 添加 ? 或 &amp;
2010/02/09 PHP
解析用PHP读写音频文件信息的详解(支持WMA和MP3)
2013/05/10 PHP
一个PHP二维数组排序的函数分享
2014/01/17 PHP
php跨服务器访问方法小结
2015/05/12 PHP
Jquery实现列表(隔行换色,全选,鼠标滑过当前行)效果实例
2013/06/09 Javascript
用js来获取上传的文件名纯粹是为了美化而用
2013/10/23 Javascript
javascript实现捕捉键盘上按下的键
2015/05/05 Javascript
Node.js中JavaScript操作MySQL的常用方法整理
2016/03/01 Javascript
js操作XML文件的实现方法兼容IE与FireFox
2016/06/25 Javascript
详解JavaScript对象的深浅复制
2017/03/30 Javascript
JS 中使用Promise 实现红绿灯实例代码(demo)
2017/10/20 Javascript
vue 左滑删除功能的示例代码
2019/01/28 Javascript
p5.js临摹动态图形实现方法详解
2019/10/23 Javascript
element-ui table组件如何使用render属性的实现
2019/11/04 Javascript
JavaScript闭包原理与用法学习笔记
2020/05/29 Javascript
vue proxy 的优势与使用场景实现
2020/06/15 Javascript
[12:36]《DOTA2》国服注册与激活指南全攻略
2013/04/28 DOTA
跟老齐学Python之编写类之三子类
2014/10/11 Python
对pandas的dataframe绘图并保存的实现方法
2017/08/05 Python
python实现求最长回文子串长度
2018/01/22 Python
详解python读取和输出到txt
2019/03/29 Python
python用分数表示矩阵的方法实例
2021/01/11 Python
YSL圣罗兰美妆美国官网:Yves Saint Lauret US
2016/11/21 全球购物
斯德哥尔摩通票:Stockholm Pass
2018/01/09 全球购物
购买美国制造的相框和画框架:Picture Frames
2018/08/14 全球购物
GANT葡萄牙官方商店:拥有美国运动服传统的生活方式品牌
2018/10/18 全球购物
欧舒丹俄罗斯官方网站:L’OCCITANE俄罗斯
2019/11/22 全球购物
初中数学教学反思
2014/01/16 职场文书
竞选生活委员演讲稿
2014/04/28 职场文书
党员承诺书范文
2014/05/19 职场文书
教师听课评语大全
2014/12/31 职场文书
管理人员岗位职责
2015/02/14 职场文书
珍惜时间的诗歌赏析
2019/08/23 职场文书
React-vscode使用jsx语法的问题及解决方法
2021/06/21 Javascript