浅谈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 全文检索的使用示例
Jun 07 MySQL
mysql 如何获取两个集合的交集/差集/并集
Jun 08 MySQL
MySQL的安装与配置详细教程
Jun 26 MySQL
Mysql案例刨析事务隔离级别
Sep 25 MySQL
Linux系统下MySQL配置主从分离的步骤
Mar 21 MySQL
分享几个简单MySQL优化小妙招
Mar 31 MySQL
MySQL 外连接语法之 OUTER JOIN
Apr 09 MySQL
MySQL创建管理KEY分区
Apr 13 MySQL
以MySQL5.7为例了解一下执行计划
Apr 13 MySQL
MySQ InnoDB和MyISAM存储引擎介绍
Apr 26 MySQL
MySQL数据管理操作示例讲解
Dec 24 MySQL
MySQL中TIMESTAMP类型返回日期时间数据中带有T的解决
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 遍历文件实现代码
2011/05/04 PHP
php比较两个字符串长度的方法
2015/07/13 PHP
PHP抽象类与接口的区别详解
2019/03/21 PHP
IE bug table元素的innerHTML
2010/01/11 Javascript
jquery创建并行对象或者合并对象的实现代码
2012/10/10 Javascript
jQuery中.live()方法的用法深入解析
2013/12/30 Javascript
一款基于jQuery的图片场景标注提示弹窗特效
2015/01/05 Javascript
浅谈JavaScript 浏览器对象
2016/06/03 Javascript
JS清除字符串中重复值的实现方法
2016/08/03 Javascript
Javascript oop设计模式 面向对象编程简单实例介绍
2016/12/13 Javascript
关于angular js_$watch监控属性和对象详解
2017/04/24 Javascript
JS请求servlet功能示例
2017/06/01 Javascript
微信小程序日历组件calendar详解及实例
2017/06/08 Javascript
vue实现表格数据的增删改查
2017/07/10 Javascript
浅谈js中的this问题
2017/08/31 Javascript
vue-for循环嵌套操作示例
2019/01/28 Javascript
JS数组reduce()方法原理及使用技巧解析
2020/07/14 Javascript
详解JavaScript中new操作符的解析和实现
2020/09/04 Javascript
使用Python中的线程进行网络编程的入门教程
2015/04/15 Python
Python实现进程同步和通信的方法
2018/01/02 Python
pyqt5 禁止窗口最大化和禁止窗口拉伸的方法
2019/06/18 Python
PyQt使用QPropertyAnimation开发简单动画
2020/04/02 Python
keras自动编码器实现系列之卷积自动编码器操作
2020/07/03 Python
CSS3实现线性渐变用法示例代码详解
2020/08/07 HTML / CSS
html5使用canvas画三角形
2014/12/15 HTML / CSS
匡威意大利官方商店 :Converse意大利
2018/11/27 全球购物
党员创先争优承诺书
2014/03/26 职场文书
应届生求职信
2014/05/31 职场文书
企业年度评优方案
2014/06/02 职场文书
学习十八大的心得体会
2014/09/12 职场文书
教师批评与自我批评心得体会
2014/10/16 职场文书
2014年会计工作总结
2014/11/27 职场文书
MBA推荐信怎么写
2015/03/25 职场文书
入党宣誓大会后的感想
2015/08/10 职场文书
Python实现Excel文件的合并(以新冠疫情数据为例)
2022/03/20 Python
SpringBoot深入分析讲解监听器模式下
2022/07/15 Java/Android