浅谈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 相关文章推荐
多表查询、事务、DCL
Apr 05 MySQL
Mysql 如何批量插入数据
Apr 06 MySQL
新手入门Mysql--概念
Jun 18 MySQL
MySQL一些常用高级SQL语句
Jul 03 MySQL
MySQL 5.7常见数据类型
Jul 15 MySQL
mysql如何能有效防止删库跑路
Oct 05 MySQL
mysql分表之后如何平滑上线详解
Nov 01 MySQL
解决MySQL添加新用户-ERROR 1045 (28000)的问题
Mar 03 MySQL
MySQL Server层四个日志的实现
Mar 31 MySQL
MySQL 计算连续登录天数
May 11 MySQL
MySQL提升大量数据查询效率的优化神器
Jul 07 MySQL
MySQL的意向共享锁、意向排它锁和死锁
Jul 15 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
2个自定义的PHP in_array 函数,解决大量数据判断in_array的效率问题
2014/04/08 PHP
PHP模板引擎smarty详细介绍
2015/05/26 PHP
php自定义类fsocket模拟post或get请求的方法
2015/07/31 PHP
php通过curl添加cookie伪造登陆抓取数据的方法
2016/04/02 PHP
PHP空值检测函数与方法汇总
2017/11/19 PHP
PHP代码加密的方法总结
2020/03/13 PHP
javascript编程起步(第二课)
2007/01/10 Javascript
js获取RadioButtonList的Value/Text及选中值等信息实现代码
2013/03/05 Javascript
jQuery判断checkbox是否选中的小例子
2013/12/02 Javascript
判断文档离浏览器顶部的距离的方法
2014/01/08 Javascript
JS设置下拉列表框当前所选值的方法
2015/12/22 Javascript
Jquery基础之事件操作详解
2016/06/14 Javascript
JS常见算法详解
2017/02/28 Javascript
详解nodejs操作mongodb数据库封装DB类
2017/04/10 NodeJs
JavaScript异步上传图片文件的实例代码
2017/07/04 Javascript
快速解决vue动态绑定多个class的官方实例语法无效的问题
2018/09/05 Javascript
nodejs微信开发之自动回复的实现
2019/03/17 NodeJs
微信小程序代码上传、审核发布小程序
2019/05/18 Javascript
Vue之Mixins(混入)的使用方法
2019/09/24 Javascript
使用 Vue-TCB 快速在 Vue 应用中接入云开发的方法
2020/02/10 Javascript
vue:el-input输入时限制输入的类型操作
2020/08/05 Javascript
[01:54]TI4西雅图DOTA2选手欢迎晚宴 现场报道
2014/07/08 DOTA
python定时利用QQ邮件发送天气预报的实例
2017/11/17 Python
python-docx修改已存在的Word文档的表格的字体格式方法
2018/05/08 Python
python 运用Django 开发后台接口的实例
2018/12/11 Python
Python面向对象程序设计多继承和多态用法示例
2019/04/08 Python
pyqt5 实现多窗口跳转的方法
2019/06/19 Python
python实现共轭梯度法
2019/07/03 Python
Python实现实时数据采集新型冠状病毒数据实例
2020/02/04 Python
详解Python3 定义一个跨越多行的字符串的多种方法
2020/09/06 Python
Canvas图片分割效果的实现
2019/07/29 HTML / CSS
英国派对礼服和连衣裙购物网站:TFNC London
2018/07/07 全球购物
捐款倡议书格式范文
2014/05/14 职场文书
2015年文员个人工作总结
2015/04/09 职场文书
2016年教师党员创先争优承诺书
2016/03/24 职场文书
Win11 Beta 22621.601 和 22622.601今日发布 KB5017384修复内容汇总
2022/09/23 数码科技