浅谈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多表连接查询的执行细节
Apr 24 MySQL
解读MySQL的客户端和服务端协议
May 10 MySQL
详解Mysql和Oracle之间的误区
May 18 MySQL
Mysql官方性能测试工具mysqlslap的使用简介
May 21 MySQL
一看就懂的MySQL的聚簇索引及聚簇索引是如何长高的
May 25 MySQL
MySQL完整性约束的定义与实例教程
May 30 MySQL
详解MySQL中的pid与socket
Jun 15 MySQL
mysql事务对效率的影响分析总结
Oct 24 MySQL
MySQL多表查询机制
Mar 17 MySQL
MySQL创建管理KEY分区
Apr 13 MySQL
MySQL三种方式实现递归查询
Apr 18 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
yii实现model添加默认值的方法(2种方法)
2016/01/06 PHP
PHP实现自动发送邮件功能代码(qq 邮箱)
2017/08/18 PHP
PHP调用API接口实现天气查询功能的示例
2017/09/21 PHP
浅析php如何实现爬取数据原理
2018/09/27 PHP
js下获取div中的数据的原理分析
2010/04/07 Javascript
在VS2008中使用jQuery智能感应的方法
2010/12/30 Javascript
利用javascript数组长度循环数组内所有元素
2013/12/27 Javascript
常规表格多表头查询示例
2014/02/21 Javascript
nodejs教程之环境安装及运行
2014/11/21 NodeJs
javascript中JSON对象与JSON字符串相互转换实例
2015/07/11 Javascript
在Web项目中引入Jquery插件报错的完美解决方案(图解)
2016/09/19 Javascript
微信小程序 富文本转文本实例详解
2016/10/24 Javascript
jquery ajax后台返回list,前台用jquery遍历list的实现
2016/10/30 Javascript
微信小程序 解决swiper不显示图片的方法
2017/01/04 Javascript
非常实用的vue导航钩子
2017/03/20 Javascript
Vuex之理解Store的用法
2017/04/19 Javascript
使用JavaScript实现在页面中显示距离2017年中秋节的天数
2017/09/26 Javascript
AngularJS中下拉框的高级用法示例
2017/10/11 Javascript
浅谈FastClick 填坑及源码解析
2018/03/02 Javascript
vue指令只能输入正数并且只能输入一个小数点的方法
2018/06/08 Javascript
JS实现判断图片是否加载完成的方法分析
2018/07/31 Javascript
Vue的H5页面唤起支付宝支付功能
2019/04/18 Javascript
layui 根据后台数据动态创建下拉框并同时默认选中的实例
2019/09/02 Javascript
[56:47]Ti4 循环赛第三日 iG vs Liquid
2014/07/12 DOTA
python字符串与url编码的转换实例
2018/05/10 Python
浅谈Python大神都是这样处理XML文件的
2019/05/31 Python
Python中拆分字符串的操作方法
2019/07/23 Python
关于Python中的向量相加和numpy中的向量相加效率对比
2019/08/26 Python
Python 在OpenCV里实现仿射变换—坐标变换效果
2019/08/30 Python
Linux系统下升级pip的完整步骤
2021/01/31 Python
物业管理毕业生的自我评价
2014/02/17 职场文书
中学教师教育感言
2014/02/21 职场文书
工地安全生产标语
2014/06/06 职场文书
教师节感恩老师演讲稿
2014/08/28 职场文书
三严三实学习心得体会
2014/10/13 职场文书
交通事故一次性赔偿协议书范本
2014/11/02 职场文书