浅谈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
MySQL表的增删改查基础教程
Apr 07 MySQL
如何使用Maxwell实时同步mysql数据
Apr 08 MySQL
.Net Core导入千万级数据至Mysql的步骤
May 24 MySQL
正确使用MySQL update语句
May 26 MySQL
浅谈MySQL 亿级数据分页的优化
Jun 15 MySQL
分析mysql中一条SQL查询语句是如何执行的
Jun 21 MySQL
python中的mysql数据库LIKE操作符详解
Jul 01 MySQL
MySQL学习之基础命令实操总结
Mar 19 MySQL
MySQL表锁、行锁、排它锁及共享锁的使用详解
Apr 02 MySQL
MySQL磁盘碎片整理实例演示
Apr 03 MySQL
详细聊一聊mysql的树形结构存储以及查询
Apr 05 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
深入apache配置文件httpd.conf的部分参数说明
2013/06/28 PHP
php操作xml
2013/10/27 PHP
PHP常见漏洞攻击分析
2016/02/21 PHP
PHP使用Mysqli类库实现完美分页效果的方法
2016/04/07 PHP
使用ThinkPHP的自动完成实现无限级分类实例详解
2016/09/02 PHP
PHP集成环境XAMPP的安装与配置
2018/11/13 PHP
使用js获取地址栏中传递的值
2013/07/02 Javascript
JavaScript按位运算符的应用简析
2014/02/04 Javascript
RequireJS入门一之实现第一个例子
2015/09/30 Javascript
JS+CSS实现的蓝色table选项卡效果
2015/10/08 Javascript
webpack+vue2构建vue项目骨架的方法
2018/01/09 Javascript
vue中手机号,邮箱正则验证以及60s发送验证码的实例
2018/03/16 Javascript
vuex 的简单使用
2018/03/22 Javascript
基于JS实现html中placeholder属性提示文字效果示例
2018/04/19 Javascript
bootstrap 弹出框modal添加垂直方向滚轴效果
2018/07/09 Javascript
微信小程序自定义toast组件的方法详解【含动画】
2019/05/11 Javascript
js回文数的4种判断方法示例
2019/06/04 Javascript
Vue中的transition封装组件的实现方法
2019/08/13 Javascript
js验证密码强度解析
2020/03/18 Javascript
使用Python的Flask框架构建大型Web应用程序的结构示例
2016/06/04 Python
python: 判断tuple、list、dict是否为空的方法
2018/10/22 Python
使用python实现http及ftp服务进行数据传输的方法
2018/10/26 Python
对python3.4 字符串转16进制的实例详解
2019/06/12 Python
PyTorch预训练的实现
2019/09/18 Python
python使用socket实现的传输demo示例【基于TCP协议】
2019/09/24 Python
python如何更新包
2020/06/11 Python
python 中的9个实用技巧,助你提高开发效率
2020/08/30 Python
python绘制趋势图的示例
2020/09/17 Python
HTML5是什么 HTML5是什么意思 HTML5简介
2012/10/26 HTML / CSS
Harrods英国:世界领先的奢侈品百货商店
2020/09/23 全球购物
了解AppleTalk协议吗
2014/04/01 面试题
高中生自我评语大全
2014/01/19 职场文书
实习鉴定评语
2014/01/19 职场文书
新郎答谢词
2015/01/04 职场文书
2019年干货:自我鉴定
2019/03/25 职场文书
漫画「狩龙人拉格纳」公开TV动画预告图
2022/03/22 日漫