浅谈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复制问题的三个参数分析
Apr 07 MySQL
MySQL 不等于的三种使用及区别
Jun 03 MySQL
mysql 如何获取两个集合的交集/差集/并集
Jun 08 MySQL
解决mysql问题:由于找不到MSVCR120.dll,无法继续执行代码
Jun 26 MySQL
详细聊聊MySQL中慢SQL优化的方向
Aug 30 MySQL
mysql配置SSL证书登录的实现
Sep 04 MySQL
一文搞懂MySQL索引页结构
Feb 28 MySQL
如何创建一个创建MySQL数据库中的datetime类型
Mar 21 MySQL
MySQL创建管理KEY分区
Apr 13 MySQL
mysql 体系结构和存储引擎介绍
May 06 MySQL
Mysql中的触发器定义及语法介绍
Jun 25 MySQL
mysql通过group by分组取最大时间对应数据的两种有效方法
Sep 23 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
SMARTY学习手记
2007/01/04 PHP
dedecms系统常用术语汇总
2007/04/03 PHP
Windows下的PHP安装文件线程安全和非线程安全的区别
2014/04/23 PHP
利用PHP将部分内容用星号替换
2020/04/21 PHP
JS读取XML文件示例代码
2013/11/15 Javascript
基于jQuery实现复选框的全选 全不选 反选功能
2014/11/24 Javascript
JavaScript中的Web worker多线程API研究
2014/12/06 Javascript
js实现div拖动动画运行轨迹效果代码分享
2015/08/27 Javascript
使用three.js 画渐变的直线
2016/06/05 Javascript
点击按钮出现60秒倒计时的简单js代码(推荐)
2016/06/07 Javascript
AngularJS 实现JavaScript 动画效果详解
2016/09/08 Javascript
jquery+css3问卷答题卡翻页动画效果示例
2016/10/26 Javascript
ionic实现底部分享功能
2017/05/11 Javascript
使用Bootstrap + Vue.js实现表格的动态展示、新增和删除功能
2017/11/27 Javascript
详解Angular调试技巧之报错404(not found)
2018/01/31 Javascript
JS中的两种数据类型及实现引用类型的深拷贝的方法
2018/08/12 Javascript
VUE table表格动态添加一列数据,新增的这些数据不可以编辑(v-model绑定的数据不能实时更新)
2020/04/03 Javascript
js实现无缝轮播图特效
2020/05/09 Javascript
pytyon 带有重复的全排列
2013/08/13 Python
python中的print()输出
2019/04/12 Python
在keras中实现查看其训练loss值
2020/06/16 Python
基于python获取本地时间并转换时间戳和日期格式
2020/10/27 Python
EJB的基本架构
2016/09/22 面试题
产品销售员岗位职责
2013/12/18 职场文书
端午节活动策划方案
2014/03/09 职场文书
新春寄语大全
2014/04/09 职场文书
租赁协议书范本
2014/04/22 职场文书
个人评语大全
2014/05/04 职场文书
社区关爱留守儿童活动方案
2014/08/22 职场文书
学生会感恩节活动方案
2014/10/11 职场文书
民事诉讼代理授权委托书
2014/10/11 职场文书
争先创优个人总结
2015/03/04 职场文书
新郎父亲婚礼致辞
2015/07/27 职场文书
2016年度农村党员干部主题教育活动总结
2016/04/06 职场文书
微信小程序基础教程之echart的使用
2021/06/01 Javascript
利用python做数据拟合详情
2021/11/17 Python