浅谈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 05 MySQL
多属性、多分类MySQL模式设计
Apr 05 MySQL
MySQL性能压力基准测试工具sysbench的使用简介
Apr 21 MySQL
MySQL慢查询的坑
Apr 28 MySQL
Mysql效率优化定位较低sql的两种方式
May 26 MySQL
新手入门Mysql--sql执行过程
Jun 20 MySQL
MySQL中日期型单行函数代码详解
Jun 21 MySQL
Mysql实现简易版搜索引擎的示例代码
Aug 30 MySQL
MySQL 服务和数据库管理
Nov 11 MySQL
MySQL利用UNION连接2个查询排序失效详解
Nov 20 MySQL
详解MySQL的主键查询为什么这么快
Apr 03 MySQL
MySql按时,天,周,月进行数据统计
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
PHP获得用户使用的代理服务器ip即真实ip
2006/12/31 PHP
php UTF8 文件的签名问题
2009/10/30 PHP
PHP取二进制文件头快速判断文件类型的实现代码
2013/08/05 PHP
php生成短网址示例
2014/05/05 PHP
PHP的伪随机数与真随机数详解
2015/05/27 PHP
php使用Jpgraph绘制饼状图的方法
2015/06/10 PHP
escape、encodeURI 和 encodeURIComponent 的区别
2009/03/02 Javascript
javascript instanceof 与typeof使用说明
2010/01/11 Javascript
浅析JS中的 map, filter, some, every, forEach, for in, for of 用法总结
2017/03/29 Javascript
微信小程序中使用Promise进行异步流程处理的实例详解
2017/08/17 Javascript
基于Vue.js 2.0实现百度搜索框效果
2020/12/28 Javascript
Vue.js项目中管理每个页面的头部标签的两种方法
2018/06/25 Javascript
开发用到的js封装方法(20种)
2018/10/12 Javascript
JS实现求字符串中出现最多次数的字符和次数示例
2019/07/05 Javascript
Vue 实现前端权限控制的示例代码
2019/07/09 Javascript
windows如何把已安装的nodejs高版本降级为低版本(图文教程)
2020/12/14 NodeJs
Python通过poll实现异步IO的方法
2015/06/04 Python
python批量制作雷达图的实现方法
2016/07/26 Python
python通过pip更新所有已安装的包实现方法
2017/05/19 Python
Python实现读写sqlite3数据库并将统计数据写入Excel的方法示例
2017/08/07 Python
用Python中的turtle模块画图两只小羊方法
2019/04/09 Python
Python学习笔记之自定义函数用法详解
2019/06/08 Python
python协程gevent案例 爬取斗鱼图片过程解析
2019/08/27 Python
python实现自动化报表功能(Oracle/plsql/Excel/多线程)
2019/12/02 Python
Pandas读取csv时如何设置列名
2020/06/02 Python
德国奢侈品网上商城:Mytheresa
2016/08/24 全球购物
波兰运动鞋网上商店:e-Sporting
2018/02/16 全球购物
如何找出EMP表里面SALARY第N高的employee
2013/12/05 面试题
Linux内核产生并发的原因
2012/07/13 面试题
大学生军训自我评价分享
2013/11/09 职场文书
经理管理专业毕业自荐书范文
2014/02/12 职场文书
安全生产活动月方案
2014/03/09 职场文书
校园新闻稿范文
2015/07/18 职场文书
2016年元旦寄语
2015/08/17 职场文书
纯html+css实现打字效果
2021/08/02 HTML / CSS
Java数组详细介绍及相关工具类
2022/04/14 Java/Android