浅谈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字段要使用NOT NULL
May 13 MySQL
解决Navicat for MySQL 连接 MySQL 报2005错误的问题
May 29 MySQL
新手入门Mysql--概念
Jun 18 MySQL
MySQL 数据恢复的多种方法汇总
Jun 21 MySQL
如何搭建 MySQL 高可用高性能集群
Jun 21 MySQL
浅谈MySQL函数
Oct 05 MySQL
mysql5.6主从搭建以及不同步问题详解
Dec 04 MySQL
mysql sum(if())和count(if())的用法说明
Jan 18 MySQL
MySQL多表查询机制
Mar 17 MySQL
MySQL安装失败的原因及解决步骤
Jun 14 MySQL
MySQL远程无法连接的一些常见原因总结
Sep 23 MySQL
mysql数据库如何转移到oracle
Dec 24 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调用API接口实现天气查询功能的示例
2017/09/21 PHP
PHP 实现人民币小写转换成大写的方法及大小写转换函数
2017/11/17 PHP
nodejs 后缀名判断限制代码
2011/03/31 NodeJs
JavaScript数组Array对象增加和删除元素方法总结
2015/01/20 Javascript
推荐一个自己用的封装好的javascript插件
2015/01/29 Javascript
Node.js的项目构建工具Grunt的安装与配置教程
2016/05/12 Javascript
详解用webpack2.0构建vue2.0超详细精简版
2017/04/05 Javascript
jquery根据name取得select选中的值实例(超简单)
2018/01/25 jQuery
Bootstrap模态对话框用法简单示例
2018/08/31 Javascript
微信小程序自定义组件的实现方法及自定义组件与页面间的数据传递问题
2018/10/09 Javascript
详解如何在vue项目中使用eslint+prettier格式化代码
2018/11/10 Javascript
Vuex的actions属性的具体使用
2019/04/14 Javascript
js时间转换毫秒的实例代码
2019/08/21 Javascript
JS实现提示效果弹出及延迟隐藏的功能
2019/08/26 Javascript
JS实现音乐钢琴特效
2020/01/06 Javascript
Vue数字输入框组件示例代码详解
2020/01/15 Javascript
单线程JavaScript实现异步过程详解
2020/05/19 Javascript
使用Python的Tornado框架实现一个一对一聊天的程序
2015/04/25 Python
全面了解Python的getattr(),setattr(),delattr(),hasattr()
2016/06/14 Python
Python 正则表达式入门(初级篇)
2016/12/07 Python
Python实现求两个csv文件交集的方法
2017/09/06 Python
Python 解决中文写入Excel时抛异常的问题
2018/05/03 Python
Python带动态参数功能的sqlite工具类
2018/05/26 Python
python接口自动化(十六)--参数关联接口后传(详解)
2019/04/16 Python
python替换字符串中的子串图文步骤
2019/06/19 Python
django-rest-framework 自定义swagger过程详解
2019/07/18 Python
使用python matploblib库绘制准确率,损失率折线图
2020/06/16 Python
Html5中的桌面通知Notification的实现
2018/09/25 HTML / CSS
英国票务网站:Ticketmaster英国
2018/08/27 全球购物
领先的荷兰线上超市:荷兰之家Holland at Home(支持中文)
2021/01/21 全球购物
QA工程师岗位职责
2013/11/20 职场文书
数学检讨书1000字
2014/02/24 职场文书
三八妇女节演讲稿
2014/05/27 职场文书
会计电算化专业求职信
2014/06/10 职场文书
公司财务会计主管应聘求职信
2014/09/26 职场文书
2015暑假社会调查报告
2015/07/13 职场文书