浅谈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 - 常用函数 每天积极向上
Apr 05 MySQL
数据库连接池
Apr 06 MySQL
mysql死锁和分库分表问题详解
Apr 16 MySQL
Mysql基础知识点汇总
May 26 MySQL
一文读懂navicat for mysql基础知识
May 31 MySQL
MySQL的InnoDB存储引擎的数据页结构详解
Mar 03 MySQL
MySQL插入数据与查询数据
Mar 25 MySQL
一文简单了解MySQL前缀索引
Apr 03 MySQL
分析MySQL优化 index merge 后引起的死锁
Apr 19 MySQL
mysql 获取相邻数据项
May 11 MySQL
Mysql开启外网访问
May 15 MySQL
MySQL中dd::columns表结构转table过程及应用详解
Sep 23 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通过隐藏表单控件获取到前两个页面的url
2014/09/09 PHP
Joomla实现组件中弹出一个模式(modal)窗口的方法
2016/05/04 PHP
PHP+Ajax无刷新带进度条图片上传示例
2017/02/08 PHP
ThinkPHP实现登录退出功能
2017/06/29 PHP
php制作圆形用户头像的实例_自定义封装类源代码
2017/09/18 PHP
DOM相关内容速查手册
2007/02/07 Javascript
jquery 操作单选框,复选框,下拉列表实现代码
2009/10/27 Javascript
深入理解JavaScript系列(13) This? Yes,this!
2012/01/18 Javascript
node.js中的定时器nextTick()和setImmediate()区别分析
2014/11/26 Javascript
基于Jquery实现表单验证
2020/07/20 Javascript
省市二级联动小案例讲解
2016/07/24 Javascript
jQuery绑定事件方法及区别(bind,click,on,live,one)
2017/08/14 jQuery
使用vs code开发Nodejs程序的使用方法
2017/09/21 NodeJs
浅析Javascript中双等号(==)隐性转换机制
2017/10/27 Javascript
浅谈Angular HttpClient简单入门
2018/05/04 Javascript
IE9 elementUI文件上传的问题解决
2018/10/17 Javascript
Vue编写可显示周和月模式的日历 Vue自定义日历内容的显示
2019/06/26 Javascript
Vue使用Clipboard.JS在h5页面中复制内容实例详解
2019/09/03 Javascript
node.js使用mongoose操作数据库实现购物车的增、删、改、查功能示例
2019/12/23 Javascript
vue:el-input输入时限制输入的类型操作
2020/08/05 Javascript
[20:21]《一刀刀一天》第十六期:TI国际邀请赛正式打响,总奖金超过550万
2014/05/23 DOTA
基于wxpython开发的简单gui计算器实例
2015/05/30 Python
python实现读Excel写入.txt的方法
2018/04/29 Python
python format 格式化输出方法
2018/07/16 Python
Python3爬虫学习入门教程
2018/12/11 Python
python的debug实用工具 pdb详解
2019/07/12 Python
python matplotlib库直方图绘制详解
2019/08/10 Python
基于python实现地址和经纬度转换
2020/05/19 Python
Pytorch上下采样函数--interpolate用法
2020/07/07 Python
利用Python pandas对Excel进行合并的方法示例
2020/11/04 Python
BLACKMORES澳洲官网:澳大利亚排名第一的保健品牌
2018/09/27 全球购物
英国领先的男装设计师服装独立零售商:Repertoire Fashion
2020/10/19 全球购物
简短证婚人证婚词
2014/01/09 职场文书
餐厅总厨求职信
2014/03/04 职场文书
技校毕业生自荐信范文
2014/03/07 职场文书
大学学风建设方案
2014/05/04 职场文书