浅谈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 sql_mode修改不生效的原因及解决
May 07 MySQL
MySQL 分组查询的优化方法
May 12 MySQL
MySQL 视图(View)原理解析
May 19 MySQL
MySQL之PXC集群搭建的方法步骤
May 25 MySQL
Mysql中 unique列插入重复值该怎么解决呢
May 26 MySQL
Navicat连接MySQL错误描述分析
Jun 02 MySQL
分析mysql中一条SQL查询语句是如何执行的
Jun 21 MySQL
MySQL对数据表已有表进行分区表的实现
Nov 01 MySQL
Mysql 如何合理地统计一个数据库里的所有表的数据量
Apr 18 MySQL
MySQL脏读,幻读和不可重复读
May 11 MySQL
MySql如何将查询的出来的字段进行转换
Jun 14 MySQL
mysql拆分字符串作为查询条件的示例代码
Jul 07 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
删除html标签得到纯文本可处理嵌套的标签
2014/04/28 PHP
PHP使用星号替代用户名手机和邮箱的实现代码
2018/02/07 PHP
JavaScript中的new的使用方法与注意事项
2007/05/16 Javascript
动态表格Table类的实现
2009/08/26 Javascript
自写的一个jQuery圆角插件
2010/10/26 Javascript
JavaScript获取页面上某个元素的代码
2011/03/13 Javascript
解决js正则匹配换行问题实现代码
2012/12/10 Javascript
JS的千分位算法实现思路
2013/07/31 Javascript
jQuery实现等比例缩放大图片让大图片自适应页面布局
2013/10/16 Javascript
事件委托与阻止冒泡阻止其父元素事件触发
2014/09/02 Javascript
JS自定义对象实现Java中Map对象功能的方法
2015/01/20 Javascript
jquery中ajax处理跨域的三大方式
2016/01/05 Javascript
深入分析javascript中console命令
2016/08/14 Javascript
基于JS快速实现导航下拉菜单动画效果附源码下载
2016/10/27 Javascript
node+vue实现用户注册和头像上传的实例代码
2017/07/20 Javascript
Vue+webpack项目基础配置教程
2018/02/12 Javascript
jQuery实现的电子时钟效果完整示例
2018/04/28 jQuery
Echarts动态加载多条折线图的实现代码
2019/05/24 Javascript
使用 Vue 实现一个虚拟列表的方法
2019/08/20 Javascript
javascript-hashchange事件和历史状态管理实例分析
2020/04/18 Javascript
vue如何搭建多页面多系统应用
2020/06/17 Javascript
解决vue页面渲染但dom没渲染的操作
2020/07/27 Javascript
vue实现简易计算器功能
2021/01/20 Vue.js
Django Highcharts制作图表
2016/08/27 Python
Python 获取当前所在目录的方法详解
2017/08/02 Python
pandas object格式转float64格式的方法
2018/04/10 Python
Python闭包函数定义与用法分析
2018/07/20 Python
使用python实现数组、链表、队列、栈的方法
2019/12/20 Python
爱游人:Travelliker
2017/09/05 全球购物
企业管理部经理岗位职责
2013/12/24 职场文书
男性健康日的活动方案
2014/08/18 职场文书
开会通知短信大全
2015/04/20 职场文书
2015年酒店前台工作总结
2015/04/20 职场文书
Windows10下安装MySQL8
2021/04/06 MySQL
python接口测试返回数据为字典取值方式
2022/02/12 Python
react中useState使用:如何实现在当前表格直接更改数据
2022/08/05 Javascript