高性能 MySQL(十一):优化特定类型的查询

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 本篇文章主要讲述,对特点类型的查询进行优化。

ed3be9530be6a6cae5ee7aa9b2054944_image_auth_key=1686638347-iyMkDP5JyC8wUv4VcrtXfb-0-015de2229a22d3f40a5fd4963a120fa5&file_size=58402.png

大家好,我是水滴~~

本篇文章主要讲述,对特点类型的查询进行优化。

一、优化 count() 查询

count()是一个特殊的函数,有两种非常不同的作用:它可以统计某个列值的数量,并且只统计列值是非空的。另一个作用是统计结果集的行数,当 MySQL 确认括号内的表达式值不可能为空时,实际上就是在统计行数。

当我们使用count(*)的时候,这种情况下通配符*并不会像我们猜想的那样扩展成所有的列,实际上,MySQL 会忽略所有的列而直接统计所有的行数。

一个常见的错误是,统计行数时在括号内指定了一个列。如果希望得到结果集的行数,最好使用count(*),这样写意义清晰,性能也会很好。

二、优化关联查询

优化关联查询时,需要特别注意以下几点:

  • 确保 on 或者 using子句中的列上有索引。在创建索引的时候就要考虑到关联的顺序。
  • 确保任何的 group byorder by 中的表达式只涉及到一个表中的列,这样 MySQL 才有可能使用索引来优化这个过程。
  • 升级 MySQL 时需注意:关联语法、运算符优先级等其他可能会发生变化的地方。

三、优化子查询

关于子查询的优化,建议尽可能使用关联查询来代替。当然 MySQL 5.6 或更高版本,可以直接忽略该建议。

四、优化 group bydistinct

这两种查询都可以使用索引来优化,这也是最有效的优化办法。

当无法使用索引的时候,group by 有两种策略来完成:使用临时表或者文件排序来做分组。对于任何查询语句,这两种策略的性能都有可以提升的地方。可以通过使用提示 SQL_BIG_RESULT 和 SQL_SMALL_RESULT 来让优化器按照你希望的方式支行。

如果需要对关联查询做 group by 分组,并且是按照查找表中的某个列进行分组,那么通常采用查找表的标识列分组的效率会比其他列更高。

五、优化 limit 分页

在系统中需要进行分页操作的时候,通常会使用 limit 加上偏移量的办法来实现,同时加上合适的 order by 子句。如果有对应的索引,通常效率会不错。

一个非常常见又令人头疼的问题是,在偏移量非常大的时候,例如可能是 limit 1000,20 这样的查询,这时 MySQL 需要查询 10020 条记录,然后只返回最后 20 条,前面的 10000 条记录都将被抛弃,这样的代价非常高。要优化这样的查询,要么是在页面中限制分页的数量,要么是优化大偏移量的性能。

优化此类分页查询的一个最简单的办法,就是尽可能地使用索引覆盖扫描,而不是查询所有的列。然后根据需要做一次关联操作再返回所需的列。对于偏移量很大的时候,这样做的效率会提升非常大。

六、优化 SQL_CALC_FOUND_ROWS

分页的时候,另一个常用的技巧是在 limit 语句中加上 SQL_CALC_FOUND_ROWS 提示(hint),这样就可以获得去掉 limit 以后满足条件的行数,因此可以作为分页的总数。

实际上,MySQL 也是扫描了所有满足条件的行以后,才会知道行数,所以加上这个提示的代价可能非常高。

一个更好的设计是,将具体的页数换成“下一页”按钮。另一种做法是使用缓存技术,先缓存一部分数据。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
5天前
|
存储 算法 关系型数据库
MySQL连接的原理⭐️4种优化连接的手段性能提升240%🚀
MySQL连接的原理⭐️4种优化连接的手段性能提升240%🚀
|
5天前
|
SQL canal 运维
MySQL高可用架构探秘:主从复制剖析、切换策略、延迟优化与架构选型
MySQL高可用架构探秘:主从复制剖析、切换策略、延迟优化与架构选型
|
5天前
|
存储 算法 关系型数据库
MySQL怎样处理排序⭐️如何优化需要排序的查询?
MySQL怎样处理排序⭐️如何优化需要排序的查询?
|
5天前
|
SQL 存储 关系型数据库
5分钟搞懂MySQL半连接优化⭐️多种半连接的优化策略
5分钟搞懂MySQL半连接优化⭐️多种半连接的优化策略
|
5天前
|
SQL 存储 关系型数据库
MySQL的3种索引合并优化⭐️or到底能不能用索引?
MySQL的3种索引合并优化⭐️or到底能不能用索引?
|
5天前
|
SQL 关系型数据库 MySQL
MySQL数据库的约束+进阶版新增与查询-2
MySQL数据库的约束+进阶版新增与查询
12 1
|
5天前
|
关系型数据库 MySQL 测试技术
MySQL数据库的约束+进阶版新增与查询-1
MySQL数据库的约束+进阶版新增与查询
16 1
|
5天前
|
SQL 存储 关系型数据库
MySQL查询原理,看这一篇就够了!
MySQL查询原理,看这一篇就够了!
|
4天前
|
关系型数据库 MySQL 数据库
docker MySQL删除数据库时的错误(errno: 39)
docker MySQL删除数据库时的错误(errno: 39)
14 0
|
2天前
|
关系型数据库 MySQL 数据库
mysql 设置环境变量与未设置环境变量连接数据库的区别
设置与未设置MySQL环境变量在连接数据库时主要区别在于命令输入方式和系统便捷性。设置环境变量后,可直接使用`mysql -u 用户名 -p`命令连接,而无需指定完整路径,提升便利性和灵活性。未设置时,需输入完整路径如`C:\Program Files\MySQL\...`,操作繁琐且易错。为提高效率和减少错误,推荐安装后设置环境变量。[查看视频讲解](https://www.bilibili.com/video/BV1vH4y137HC/)。
21 3
mysql 设置环境变量与未设置环境变量连接数据库的区别