浅谈MySQL之select优化方案
作者:xiaoff 发布时间:2024-01-27 03:32:38
目录
生活中的例子
慢查询
如何去优化
count
limit
最大值最小值min&max
生活中的例子
我们是否看到过在公司中许多查询语句都是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;
来源:https://juejin.cn/post/6992374842003554318


猜你喜欢
- 废话少说,上干活。for的基本操作for是用来循环的,是从某个对象那里依次将元素读取出来。看下面的例子,将已经学习过的数据对象用for循环一
- 前言相信大家在日常的web开发中,作为前端经常会遇到处理图片拉伸问题的情况。例如banner、图文列表、头像等所有和用户或客户自主操作图片上
- 本文实例讲述了Python面向对象之私有属性和私有方法。分享给大家供大家参考,具体如下:01. 应用场景及定义方式应用场景在实际开发中,对象
- 默认情况下,PyCharm中如果有无法错误或者不符合PEP8规范代码下面会有波浪线,语法错误波浪线为红色(如下图的第10行),不符合PEP8
- 前言对于我这种英语比较差的人来说,无论是敲代码还是看文档,那都是离不开翻译软件的,于是我想自己用python做一个翻译软件,花了一个小时,终
- 一、递归原理小案例分析(1)# 概述递归:即一个函数调用了自身,即实现了递归 凡是循环能做到的事,递归一般都能做到!(2)# 写
- 前言双端比较算法是vue2.x采用的diff算法,本篇文章只是对双端比较算法粗略的过程进行了一下分析,具体细节还是得Vue源码,Vue的源码
- 如下所示:<html xmlns="http://www.w3.org/1999/xhtml"><he
- 一、半同步简介MASTER节点在执行完客户端提交的事务后不是立刻返回结果给客户端,而是等待至少一个SLAVE节点接收并写到relay log
- list*n生成多维数组与for循环生成多维数组的区别本文主要介绍生成二维数组的方法,同时解释使用list * n 方式所存在的问题。1.从
- 词云图什么是词云图,相信大家肯定不会感到陌生,一本书统计里面出现的词频,然后可视化展示,让读者快速的了解这个主题纲要,这就是词云的直接效果。
- 一、模块概述模块指的是包含python代码的文件,也就是一个.py文件就是一个模块。文件夹(directory)---->包(pack
- 这篇文章与大家分享13个超级有用的 jQuery 内容滚动插件和教程。您可能经常能看到一些网站上特色区域的内容以滚动方式变化,这是一种在有限
- 上一一节我们讲了while循环,while循环主要用于重复程序的运行,for循环更加倾向于遍历一个项目,即将特定内容(比如一个列表、一个字符
- 这学期在学python,感觉想写一个东西来巩固自己的基础,因为大二的时候我看过python,所以还是一共花了几个小时写了一个基于mysql的
- 目录一、任务二、实现(1)导库并创建画布(2)画图形(3)创建按钮和文本框(4)功能实现三、完整代码四、升级—绑定键盘事件总结一、任务用多个
- 调用bianli()函数,这里是遍历F:盘,bianli("F:\")'这里设置文件夹路径,你可以改为其它文件夹
- 这篇文章主要介绍了Python @property装饰器原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
- 等间距取值a = np.linspace(float(-pi), float(pi), 100)从-pi到pi取100个值对区间进行等间距取
- 上一篇已经介绍了celery的基本知识,本篇以一个小项目为例,详细说明django框架如何集成celery进行开发。本系列文章的开发环境:w