浅谈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 Innodb关键特性之插入缓冲(insert buffer)
Apr 08 MySQL
MySQL获取所有分类的前N条记录
May 07 MySQL
MySQL 数据丢失排查案例
May 08 MySQL
MySQL系列之三 基础篇
Jul 02 MySQL
ORM模型框架操作mysql数据库的方法
Jul 25 MySQL
MySQL中连接查询和子查询的问题
Sep 04 MySQL
SQL优化老出错,那是你没弄明白MySQL解释计划用法
Nov 27 MySQL
一文了解MySQL二级索引的查询过程
Feb 24 MySQL
MySQL RC事务隔离的实现
Mar 31 MySQL
MySQL的存储函数与存储过程的区别解析
Apr 08 MySQL
MySQL存储过程及语法详解
Aug 05 MySQL
MySQL 原理优化之Group By的优化技巧
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 URL编码解码函数代码
2009/03/10 PHP
php xml留言板 xml存储数据的简单例子
2009/08/24 PHP
在Windows系统上安装PHP运行环境文字教程
2010/07/19 PHP
php数组生成html下拉列表的方法
2015/07/20 PHP
laravel利用中间件做防非法登录和权限控制示例
2019/10/21 PHP
Javascript中定义方法的另类写法(批量定义js对象的方法)
2011/02/25 Javascript
利用json获取字符出现次数的代码
2012/03/22 Javascript
Javascript实现多彩雪花从天降散落效果的方法
2015/02/02 Javascript
js动态创建及移除div的方法
2015/06/03 Javascript
JS实现的文字与图片定时切换效果代码
2015/10/06 Javascript
javascript动态生成树形菜单的方法
2015/11/14 Javascript
Node.js项目中调用JavaScript的EJS模板库的方法
2016/03/11 Javascript
Bootstrap 轮播(Carousel)插件
2016/12/26 Javascript
JavaScript中为事件指定处理程序的五种方式分析
2018/07/27 Javascript
微信小程序开发之tabbar图标和颜色的实现
2018/10/17 Javascript
基于Vue-cli快速搭建项目的完整步骤
2018/11/03 Javascript
京东优选小程序的实现代码示例
2020/02/25 Javascript
微信小程序以7天为周期连续签到7天功能效果的示例代码
2020/08/20 Javascript
[02:44]2014DOTA2 国际邀请赛中国区预选赛 大神红毯秀
2014/05/25 DOTA
Python中实现对list做减法操作介绍
2015/01/09 Python
Python基础教程之tcp socket编程详解及简单实例
2017/02/23 Python
使用python编写简单的小程序编译成exe跑在win10上
2018/01/15 Python
Python3实现转换Image图片格式
2018/06/21 Python
详解Python3的TFTP文件传输
2018/06/26 Python
django的ORM操作 增加和查询
2019/07/26 Python
html5 localStorage本地存储_动力节点Java学院整理
2017/07/06 HTML / CSS
波兰在线运动商店:YesSport
2020/07/23 全球购物
应届毕业生求职信
2013/11/30 职场文书
高中生毕业自我鉴定范文
2013/12/22 职场文书
2014乡镇“三八”国际劳动妇女节活动总结
2014/03/01 职场文书
餐厅服务员岗位职责
2015/02/09 职场文书
Python基础之常用库常用方法整理
2021/04/30 Python
MySQL如何构建数据表索引
2021/05/13 MySQL
Vue3如何理解ref toRef和toRefs的区别
2022/02/18 Vue.js
python模板入门教程之flask Jinja
2022/04/11 Python