SQL 优化|学习笔记

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: 快速学习 SQL 优化

开发者学堂课程【MySQL 实操课程:SQL 优化】学习笔记,与课程紧密联系,让用户快速学习知识。  

课程地址:https://developer.aliyun.com/learning/course/717/detail/12830


SQL 优化

 

一、SQL 优化建议

1、SQL 诊断优化,会帮您分析当前执行的 SQL,并给到具体的优化建议。

通过 DMS- 数据管理服务平台,比如执行 SELECT*FROM emp;查询这个 emp 表

点击执行就会查询出来了

现在写入:SELECT * FROH emp where enawe LIKE "zhangsan%"; 执行,找到这条语句,对这条语句进行 SQL 诊断,他会帮你去分析:

图片1.png

MySQL 本身自己也提供了一些这样的功能。

诊断会包括索引专断建议和语句优化建议,这里如果没有建索引这个表,他会给你一些建议。

在 MySQL 本身有什么方式可以看到它的指标呢?

在连接 MySQL 的时候,写入 show status like’com ’可以看到 com 开头的一些变量,里面有一个 com select,讲的是当前连接客户端进来的时候总共执行的select 操作的次数,比如每次执行一次 select,当前数值是1,每执行一次就会+1

Com insert  主要讲的是执行 insert 的次数,比如批量插入的情况,他会给你算一次。

Com update 就是更新的次数,com delete 就是删除的次数。

在这些变量可以大概能够看到当前 MySQL 运行的情况,像 select 讲的是没有被缓存的次数,如果缓存被命中了,就不会给算到 select 里面。

查看指定的存储引擎:show status like ‘inndb 

比如 Inndb rows read 可以看到总共读了多少行,Inndb rows delect  删除了多少行,它会帮你记录下来。

其他还有一些像 com rollback 它的执行次数也会被统计,了解到会不会回滚,如果回滚次数很频繁,应用编写可能存在一定的问题。

也可以看当前总共有多少个连接到数据库,写入:shou status like‘connections’

这个连接次数并不是当前有多少连接,而是总共有多少次连接。

通过这些指标可以看到了,怎么做一些优化呢?

可以通过查看它执行的计划,写入 explain select*from user where name‘zhangsan1

显示:

图片2.png

Select type 表示 select 类型,如果下面是 simple 代表是单表查询,没有使用到表连接或者只查询。

如果 type 下面是 const 讲得是一行,他解锁的就是一行,如果 type 下面是 all 代表全表扫描,如果是 indest 代表是全索引扫描,如果是 range 代表是范围扫描,就是大于、等于的一些操作。

如果是 ref 讲的是使用唯一索引扫描或者唯一索引前缀扫描,主要用来返回匹配某歌单独值的记录行。

Const 是表里面最多匹配一行,这种查询速度非常的迅速,其实就是根据组件或者唯一索引进行查询的,所以这种效率是最高的。

看一条语句执行的情况可以写入:select @@have profiling 

显示为 yes,代表现在支持查看执行计划的功能。

写入 select @@profiling,显示为0.

写入 set profiling=1,执行就变为了1.

设置为1 后就可以执行刚才的 SQL 语句。

写入 show profiles  它就会把 SQL 语句记录下来。

Show profile for query 2 可以看到详细的执行情况:

Status

Duration

Starting

0.000061

Checking permissions

0.000006

Init

0.000015

System lock

0.000008

Optimizing

0.000007

Statistics

0.000012

Preparing

0.000009

Executing

0.000002

Sending data

0.000038

End

0.000002

Query end

0.000007

Closing tables

0.000005

Freeing items

0.000010

Cleaning up

0.000009

这个过程首先是 Starting 开始,然后进行权限的验证 Checking permissions,Init打开表执行初始化,System lock 系统的锁,Optimizing 优化帮你自动生成执行计划,之后做一些准备工作进行执行,执行完毕后发送数据 Sending data,涉及到MySQL server 对存储引擎之间的数据的查询与模仿,比如交给数据引擎,他帮你查询,查询完成后会将数据返回给 MySQL server 层。查询就结束了。

最终把表关了,将资源释放出来,这是整个过程。

举例:

写入 show tables,比如这里有一张表叫 show create table school:

school lCREATE TABLE ‘school‘

‘id‘int (11)DBFA0r UL,

name‘Tvarchar (20)DEFA0LT NOLL,

UNIQUE KEY`idx id_name( id  , 'name

ENGINE=InnoDB DEFAOLT CHARSET=latin1 l

可以看到这是 innoDB 的存储引擎,可以把这个表重新复制一份:create table school myisam like school,然后写入 insert into school myisam select * from school; 将数据藏起来。

然后写入 select*from school mysiam:

Id

Name

1001

Yizhong

1002

Erzhong

1003

Sanzhong

1006

liuzhong

1007

Qizhong

Show create table school mysiam,然后写入:alter table school myisam engine MYISAM 改为这个存储引擎。

查看:show profiles 会发现很多条语句,执行:select count (1)from:chool myisam;

最后输入 show profiles 可以看到查询 school 总比查询 myisam 的表要多。

写入:show profile for query 13,显示:

Status

Duration

Starting

0.000055

Checking permissions

0.000006

Init

0.000015

System lock

0.000012

Optimizing

0.000008

Statistics

0.000003

Preparing

0.000011

Executing

0.000008

Sending data

0.000038

End

0.000003

Query end

0.000008

Closing tables

0.000006

Freeing items

0.000011

Cleaning up

0.000012

这是 innoDB 存储引擎的详细执行计划,会发现这里主要的环节是 Sending data

写入 show profile for query 14,会发现没有 Sending data。

Myisam 和 innoDB 存储引擎在针对 SQL 处理过程当中是存在差异的。

Myisam 在执行统计操作的时候,不需要消耗太多的资源,因为这些数据它是直接缓存起来的,但是 innoDB 没有,所以执行时间会比较长。

如果写入更多数据在表里面,会更加明显看到它们的差异,所以针对 innoDB 和myisam 统计的场景它们的差别。

在 DMS 管理平台也是提供了这样的功能,前面讲到了可以进行 SQL 诊断,也可以看它的执行计划。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
1月前
|
SQL 存储 监控
SQL日志优化策略:提升数据库日志记录效率
通过以上方法结合起来运行调整方案, 可以显著地提升SQL环境下面向各种搜索引擎服务平台所需要满足标准条件下之数据库登记作业流程综合表现; 同时还能确保系统稳健运行并满越用户体验预期目标.
182 6
|
2月前
|
算法 数据挖掘 数据库
通过 SQL 快速使用 OceanBase 向量检索学习笔记
通过 SQL 快速使用 OceanBase 向量检索学习笔记
|
2月前
|
SQL 数据库
SQL 学习笔记 - 多表关系与多表查询
数据库多表关系包括一对多、多对多和一对一,常用外键关联。多表查询方式有隐式/显式内连接、外连接、子查询等,支持别名和条件筛选。子查询分为标量、列、行、表子查询,常用于复杂查询场景。
|
9月前
|
SQL 关系型数据库 MySQL
MySQL进阶突击系列(07) 她气鼓鼓递来一条SQL | 怎么看执行计划、SQL怎么优化?
在日常研发工作当中,系统性能优化,从大的方面来看主要涉及基础平台优化、业务系统性能优化、数据库优化。面对数据库优化,除了DBA在集群性能、服务器调优需要投入精力,我们研发需要负责业务SQL执行优化。当业务数据量达到一定规模后,SQL执行效率可能就会出现瓶颈,影响系统业务响应。掌握如何判断SQL执行慢、以及如何分析SQL执行计划、优化SQL的技能,在工作中解决SQL性能问题显得非常关键。
|
6月前
|
SQL 存储 自然语言处理
SQL的解析和优化的原理:一条sql 执行过程是什么?
SQL的解析和优化的原理:一条sql 执行过程是什么?
SQL的解析和优化的原理:一条sql 执行过程是什么?
|
8月前
|
SQL 关系型数据库 MySQL
如何优化SQL查询以提高数据库性能?
这篇文章以生动的比喻介绍了优化SQL查询的重要性及方法。它首先将未优化的SQL查询比作在自助餐厅贪多嚼不烂的行为,强调了只获取必要数据的必要性。接着,文章详细讲解了四种优化策略:**精简选择**(避免使用`SELECT *`)、**专业筛选**(利用`WHERE`缩小范围)、**高效联接**(索引和限制数据量)以及**使用索引**(加速搜索)。此外,还探讨了如何避免N+1查询问题、使用分页限制结果、理解执行计划以及定期维护数据库健康。通过这些技巧,可以显著提升数据库性能,让查询更高效流畅。
|
9月前
|
SQL 关系型数据库 MySQL
基于SQL Server / MySQL进行百万条数据过滤优化方案
对百万级别数据进行高效过滤查询,需要综合使用索引、查询优化、表分区、统计信息和视图等技术手段。通过合理的数据库设计和查询优化,可以显著提升查询性能,确保系统的高效稳定运行。
428 9
|
10月前
|
SQL Oracle 关系型数据库
如何在 Oracle 中配置和使用 SQL Profiles 来优化查询性能?
在 Oracle 数据库中,SQL Profiles 是优化查询性能的工具,通过提供额外统计信息帮助生成更有效的执行计划。配置和使用步骤包括:1. 启用自动 SQL 调优;2. 手动创建 SQL Profile,涉及收集、执行调优任务、查看报告及应用建议;3. 验证效果;4. 使用 `DBA_SQL_PROFILES` 视图管理 Profile。
|
11月前
|
SQL Oracle 数据库
使用访问指导(SQL Access Advisor)优化数据库业务负载
本文介绍了Oracle的SQL访问指导(SQL Access Advisor)的应用场景及其使用方法。访问指导通过分析给定的工作负载,提供索引、物化视图和分区等方面的优化建议,帮助DBA提升数据库性能。具体步骤包括创建访问指导任务、创建工作负载、连接工作负载至访问指导、设置任务参数、运行访问指导、查看和应用优化建议。访问指导不仅针对单条SQL语句,还能综合考虑多条SQL语句的优化效果,为DBA提供全面的决策支持。
277 11
|
SQL 缓存 监控
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
本文详细解析了数据库、缓存、异步处理和Web性能优化四大策略,系统性能优化必知必备,大厂面试高频。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)