小表驱动大表|学习笔记

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 快速学习小表驱动大表

开发者学堂课程【MySQL 高级应用 - 索引和锁小表驱动大表】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/598/detail/8623


小表驱动大表


目录:

一、查询优化

二、优化原则

三、优化思路

 

一、查询优化

1.分析

1)观察,至少跑1天,看看生产的慢 SQL 情况。

2)开启慢查询日志,设置阙值,比如超过5秒钟的就是慢 SQL,并将它抓取出来。

3explain+SQL 分析

Explain 能够告诉你这个查询在数据库中是一个什么样的执行计划来实现的。

首先我们需要有个目标,通过不断调整尝试,再借助 Explain 来验证结果是否满足自己的需求,直到得到预期的结果。

(4)show profile 分析

MySQL Explain 执行计划可以用来对Sql语句进行分析,是否进行全表扫描,是否用了索引,或者是 sql 语句先后执行计划,有没有用临时表等等,由此来进行 Sql 优化,

show Profile Explain 一样都是用来查看 Sql 语句分析的,但是形式不一样, show Profile 用来分析当前会话语句执行的资源消耗情况,能清晰的知道 sql 执行过程,以及过程中消耗的时间。

5)运维经理 or DBA ,进行 SQL 数据库服务器的参数调优。

2.总结

(1)慢查询的开启并捕获

(2)explain+SQL 分析

(3)showprofile 查询 SQL Mysq1 服务器里面的执行细节和生命周期情况

4SQL 数据库服务器的参数调优。

永远小表驱动大表 Case

for(int i =5;...)

for(int j=1000)

{

}

}

for(int i =1000;...)

{

for(int j=5){

MySQL 中的 Join,只有 Nested Loop 一种 Join 方式,也就是 MySQL Join 都是通过嵌套循环来实现的。

驱动结果集越大,所需要循环的次数就越多,那么被驱动表的访问次数自然也就越多,而每次访问被驱动表,即使需要的逻辑 IO 很少,循环次数多了,总量自然也不可能很小,而且每次循环都不能避免的需要消耗 CPU,所以 CPU 运算量也会跟着增加。

使用小的部门表,得到小表,连接大表

 

二、优化原则

优化原则:小表驱动大表,即小的数据集驱动大的数据集。

RBO 基于规则

select * from A where id in (select id from B)

等价于:

for select id from B

for select * from A where A.id=B.id

B 表的数据售必须小于 A 表的数据集时,用 in 优于exists

select * from A where exists(select 1 fromB where B.id=A.id)

等价于

for select * from A

for select *fromBwhere B.id=A.id

A 表的数据集系小于 B 表的数据集时,用 exists 优于 in

注意:

A 表与 B 表的 ID 字段应建立索引。

EXISTS

SELECT..FROM table WHERE EXISTS(subquery)

该语法可以理解为:

将主查询的数据,放到子查询中做条件验证,根据验证结果(TRUE FALSE)来决定主查询的数据结果是否得以保留。

提示

1. EXISTS(subquerv) 只返回TRUE FALSE,因此子查询中的 SELECT* 也可以是SELECT1 seleutX,官方说法是实际执行时会忽略 SELECT 清单,因此没有区别

2. EXISTS 子查询的实际执行过程可能经过了优化而不是我们理解上的逐条对比,如果担忧效率问题,可进行实际检验以确定是否有效率问题。

3.EXISTS 子查询往往也可以用条件表达式、其他子查询或者 JOIN 来替代,何种最优需要具体问题具体分析

 

三、查询优化思路

1、优化更需要优化的查询

2、定位优化对象的性能瓶颈

3、明确优化的目标

4、从 Explain 入手

5、多使用 profile

6、永远用小结果集驱动大结果集

7、尽可能在索引中完成排序

8、只取出自己需要的字段(Columns

9、仅仅使用最有效的过滤条件

10、尽可能避免复杂的 join

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
存储 SQL 关系型数据库
大数据量下数据库分页查询优化方案汇总
当需要从数据库查询的表有上万条记录的时候,一次性查询所有结果会变得很慢,特别是随着数据量的增加特别明显,这时需要使用分页查询。对于数据库分页查询,也有很多种方法和优化的点。下面简单说一下我知道的一些方法。
512 2
|
3月前
|
存储 中间件 数据库连接
|
3月前
|
缓存 定位技术 数据库
如何优化大表的查询速度?
如何优化大表的查询速度
31 1
|
4月前
分库分表中间表优化
【7月更文挑战第21天】
37 2
|
4月前
|
存储 关系型数据库 MySQL
MySQL数据库—多表设计与关联查询
MySQL数据库—多表设计与关联查询
|
负载均衡 监控 定位技术
分库表数据倾斜的处理让我联想到了 AKF 模型
这里的特殊性可以是表中字段的某一个属性,比如订单编号、创建时间等等。这就需要我们根据实际情况,既要拆分的均匀又要拆分之后能满足未来几年的发展,同时还要满足现有业务的支持。
181 0
|
数据库连接
MySQL-小表驱动大表
MySQL-小表驱动大表
136 0
|
SQL 测试技术 索引
NL连接一定是小表驱动大表效率高吗
NL连接一定是小表驱动大表效率高吗
168 0