我的编程空间,编程开发者的网络收藏夹
学习永远不晚

浅谈MySQL之select优化方案

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

浅谈MySQL之select优化方案

目录
  • 生活中的例子
  • 慢查询
  • 如何去优化
    • count
    • limit
    • 最大值最小值min&max

生活中的例子

我们是否看到过在公司中许多查询语句都是select * xxxx

心中的想法肯定是,别人写了select *,那我写吧,省去了不少麻烦事儿

慢查询

  • 首先去思考,最基本的,是否我们使用的数据库插查询语句存在了访问的数据太多
  • 其实大部分性能低的查询往往都可以通过减少访问的数据量来优化的
  • 因为select * 会给服务器带来额外的I/O、内存和cpu的消耗

数据库中慢查询开销的三个指标

  • 相应时间
  • 扫描的行数
  • 返回的行数

如果走了索引


select * from stu where id = 1;

索引会优化查询,只返回十条数据
如果没有id索引,那么就会预估访问上百上千行数据

tips: 通过mysql中的EXPLAIN命令去查看的其中rows对应的行数

其实最好的情况就是在存储引擎层过where滤掉不匹配的记录
其次好的情况是覆盖索引命中扫描,在服务器层where滤掉不匹配的记录,不需要回表查询
最的情况是从数据表返回数据,然后再过滤不满足条件的记录

如何去优化

使用索引覆盖,把我们需要的列都放在索引中,这样我们就避免了回表去查询
可以单独分出来表

重构查询(可以进行大的查询化解成小的查询)

举例: 如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优化内容请搜索自学编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持自学编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

浅谈MySQL之select优化方案

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

浅谈MySQL之select优化方案

目录生活中的例子慢查询如何去优化countlimit最大值最小值min&max生活中的例子我们是否看到过在公司中许多查询语句都是select * xxxx 心中的想法肯定是,别人写了select *,那我写吧,省去了不少麻烦事儿 慢查询首先
2022-05-31

浅谈MySQL大表优化方案

背景 阿里云RDS FOR MySQL(MySQL5.7版本)数据库业务表每月新增数据量超过千万,随着数据量持续增加,我们业务出现大表慢查询,在业务高峰期主业务表的慢查询需要几十秒严重影响业务 方案概述一、数据库设计及索引优化 MySQL数
2022-05-14

MySQL之优化SELECT语句

MySQL之优化SELECT语句 文章目录 MySQL之优化SELECT语句摘要:引言:1. MySQL性能提成优化概述2. WHERE子句优化3. 范围优化4. 哈希联接优化5. 储存引擎下的优化6. 索引条件下推优化7.嵌套循环
2023-08-16

MySQL select count(*)计数很慢优化方案

目录前言1. MyISAM存储引擎计数为什么这么快?2. 能不能手动实现统计总行数3. InnoDB引擎能否实现快速计数4. 四种计数方式的性能差别前言在日常开发工作中,我经常会遇到需要统计总数的场景,比如:统计订单总数、统计用户总数等。
2022-08-11

故障分析 | MySQL 优化案例 - select count(*)

作者:xuty本文来源:原创投稿*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。本文关键字:count、SQL、二级索引一、故事背景项目组联系我说是有一张 500w 左右的表做select count(*)速度特别慢。二、原 SQ
故障分析 | MySQL 优化案例 - select count(*)
2015-08-04

浅谈MySQL 亿级数据分页的优化

目录背景分析数据模拟1、创建两个表:员工表和部门表2、创建两个函数:生成随机字符串和随机编号3、编写存储过程,模拟500W的员工数据4、编写存储过程,模拟120的部门数据5、建立关键字段的索引,这边是跑完数据之后再建索引,会导致建索引耗时长
2022-05-27

浅说MySQL优化方法

在数据库的优化上我们有两个方面,一方面是安全,另一方面则是性能.         安全 ,就是要保证数据的可持续性;         性能,则说的就是数据的高性能访问; 2.优化方法         1)选取最适用的字段属性             一般来说,
浅说MySQL优化方法
2016-12-06

MySQL之select in 子查询优化的实现

下面的演示基于MySQL5.7.27版本 一、关于MySQL子查询的优化策略介绍:子查询优化策略 对于不同类型的子查询,优化器会选择不同的策略。1. 对于 IN、=ANY 子查询,优化器有如下策略选择:semijoinMaterializa
2022-05-13

编程热搜

目录