浅谈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 数据类型选择原则
May 27 MySQL
MySQL中in和exists区别详解
Jun 03 MySQL
MySQL快速插入一亿测试数据
Jun 23 MySQL
MySQL query_cache_type 参数与使用详解
Jul 01 MySQL
教你使用VS Code的MySQL扩展管理数据库的方法
Jan 22 MySQL
mysql下的max_allowed_packet参数设置详解
Feb 12 MySQL
一条 SQL 语句执行过程
Mar 17 MySQL
MySQL实现配置主从复制项目实践
Mar 31 MySQL
MySQL中优化SQL语句的方法(show status、explain分析服务器状态信息)
Apr 09 MySQL
SQL语句中EXISTS的详细用法大全
Jun 25 MySQL
一文解答什么是MySQL的回表
Aug 05 MySQL
前端传参数进行Mybatis调用mysql存储过程执行返回值详解
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入门基础之php代码写法
2011/12/30 PHP
PHP获取时间排除周六、周日的两个方法
2014/06/30 PHP
php中解析带中文字符的url函数分享
2015/01/20 PHP
超详细的php用户注册页面填写信息完整实例(附源码)
2015/11/17 PHP
CI操作cookie的方法分析(基于helper类库)
2016/03/28 PHP
jquery select选中的一个小问题
2009/10/11 Javascript
javascript闭包的理解和实例
2010/08/12 Javascript
js有关元素内容操作小结
2011/12/20 Javascript
jQuery中setTimeout的几种使用方法小结
2013/04/07 Javascript
JavaScript的null和undefined区别示例介绍
2014/09/15 Javascript
再谈javascript原型继承
2014/11/10 Javascript
了不起的node.js读书笔记之node.js中的特性
2014/12/22 Javascript
浅谈Javascript Base64 加密解密
2014/12/28 Javascript
js实现点击图片改变页面背景图的方法
2015/02/28 Javascript
javascript省市区三级联动下拉框菜单实例演示
2015/11/29 Javascript
js表单中选择框值的获取及表单的序列化
2015/12/17 Javascript
js中获取 table节点各tr及td的内容简单实例
2016/10/14 Javascript
jQuery中的deferred使用方法
2017/03/27 jQuery
浅析node Async异步处理模块用例分析及常用方法介绍
2017/11/17 Javascript
轻量级JS Cookie插件js-cookie的使用方法
2018/03/22 Javascript
Bootstrap-table使用footerFormatter做统计列功能
2018/09/07 Javascript
基于Vue3.0开发轻量级手机端弹框组件V3Popup的场景分析
2020/12/30 Vue.js
Python下rrdtool模块的基本使用方法
2015/11/13 Python
Python随机生成均匀分布在三角形内或者任意多边形内的点
2017/12/14 Python
python文本数据相似度的度量
2018/03/12 Python
对python自动生成接口测试的示例讲解
2018/11/30 Python
Django之使用内置函数和celery发邮件的方法示例
2019/09/16 Python
Django中提示消息messages的设置方式
2019/11/15 Python
python里的单引号和双引号的有什么作用
2020/06/17 Python
Python爬取12306车次信息代码详解
2020/08/12 Python
Sperry官网:帆船鞋创始品牌
2016/09/07 全球购物
利物浦足球俱乐部官方网上商店:Liverpool FC Official Store
2018/01/13 全球购物
应届生护士求职信
2013/11/01 职场文书
银行求职信
2014/05/31 职场文书
推广普通话主题班会
2015/08/17 职场文书
MongoDB数据库常用的10条操作命令
2021/06/18 MongoDB