索引三表优化案例|学习笔记

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 快速学习索引三表优化案例

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

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


索引三表优化案例


内容介绍

一、三表索引优化

二、Join 语句的优化


一、三表索引优化

首先我们再加入一个表 phone

CREATE TABLE IF NOT EXISTS `phone` (

`phoneid`lNT (10) UNSIGNED NOT NULL AUTO _lNCREMENT,

`card`INT(10) UNSIGNED NOT NULL ,

PRIMARYKEY (`phoneid`)

)ENGINE=INNODB;

CREATETABLEIFNOTEXISTS `phone’(

`phoneid`lNT(10) UNSIGNEDNOTNULLAUTO _lNCREMENT,

`card`INT(10) UNSIGNEDNOTNULL ,

PRIMARYKEY (`phoneid`)

)ENGINE=INNODB;

INSERT INTO phone (card)VALUES(FLOOR(1+(RAND()*20)));

INSERT INTO phone (card)VALUES(FLOOR(1+(RAND()*20)));

INSERT INTO phone(card)VALUES(FLOOR(1+(RAND()*20)));

INSERT INTO phone (card)VALUES(FLOOR(1+(RAND()*20)));

INSERT INTO phone(card)VALUES(FLOOR(1+(RAND()*20)));

INSERT INTO phone (card)VALUES(FLOOR(1+(RAND()*20)));

INSERT INTO phone(card)VALUES(FLOOR(1+(RAND0*20)));

INSERT INTO phone (card)VALUES(FLOOR(1+(RAND()*20)));

贴进后输入:

mysql>select*from phone;

就得到第三张表 phone

我们将多建的表删掉:

mysql>drop index Y on class;

若没有多余表就跳过,此时应有 classbookphone 三张表,此时我们没有建立连接,执行三表:

mysq1>explain SELECT*FROM class inner JOIN book ON class.

card=book. card inner JOIN phone ON book. card=phone. card;

此时得到下图:

image.png

这时出现了 using join buffer,因为此时表增多,MySQL 提升了性能使用了连接缓存。

接下来我们 EXPLAIN

mysq1> EXPLAIN SELECT*FROM class LEFT JOIN book ON class.

card=book. card LEFT JOIN phone ON book. card=phone. card;

结果如下图:

image.png

此时并未优化,所以都是 all

我们继续开始优化,加入索引:

mysql>ALTER TABLE `phone`ADDINDEX z (`card`);

Query OK,0 rows affected(0. 02 sec)

Records: 0 Duplicates :0 Warnings:0

mysql>ALTER TABLE `phone`ADD INDEX Y (`card`);

Query OK,0 rows affected(0. 02 sec)

Records: 0 Duplicates :0 Warnings:0

此时我们再执行:

mysq1> EXPLAIN SELECT*FROM class LEFT JOIN book ON class.

card=book. card LEFT JOIN phone ON book. card=phone. card;

此时结果如下:

image.png

这时后2行的 type 都是 ref 且总 rows 优化很好,因此要把索引设置在需要经常查询的字段中。

 

二、Join 语句的优化

1、尽可能减少 Join 语句中的 NestedLoop 的循环总次数;永远用小结果集驱动大的结果集。如书是可以无限多的,但是书的种类是少的,要用书的种类去划分书。

2、优先优化 NestedLoop 的内层循环。

3、保证 Join 语句中的被驱动表上 join 条件字段已被索引。

当无法保证被驱动的 join 条件字段被索引且内存资源充足的前提下,不要吝啬 joinBuffer 的设置。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
5月前
|
SQL 关系型数据库 MySQL
从理论到实践,Mysql查询优化剖析(联表查询)
从理论到实践,Mysql查询优化剖析(联表查询)
211 0
|
3月前
|
SQL 关系型数据库 MySQL
SQL索引构建与优化的神奇之处:如何用高效索引让你的数据检索飞起来?
【8月更文挑战第31天】在现代软件开发中,数据库索引对于提升查询性能至关重要。本文详细介绍了SQL索引的概念、构建方法及优化技巧,包括避免不必要的索引、使用复合索引等策略,并提供了实用的示例代码,如 `CREATE INDEX index_name ON table_name (column_name, another_column_name);`。通过遵循这些最佳实践,如了解查询模式和定期维护索引,可以大幅提高数据检索效率,从而增强应用程序的整体性能。
120 0
|
6月前
|
缓存 关系型数据库 MySQL
MySQL 查询优化:提速查询效率的13大秘籍(索引设计、查询优化、缓存策略、子查询优化以及定期表分析和优化)(中)
MySQL 查询优化:提速查询效率的13大秘籍(索引设计、查询优化、缓存策略、子查询优化以及定期表分析和优化)(中)
1061 0
|
6月前
|
存储 关系型数据库 MySQL
mysql索引优化,更好的创建和使用索引
mysql索引优化,更好的创建和使用索引
|
存储 关系型数据库 MySQL
MySQL基础应用拓展、索引及执行计划
MySQL基础应用拓展、索引及执行计划
84 0
MySQL基础应用拓展、索引及执行计划
|
NoSQL MongoDB 开发者
索引的使用 涵盖的查询 | 学习笔记
快速学习 索引的使用 涵盖的查询
索引的使用 涵盖的查询 | 学习笔记
|
关系型数据库 MySQL 开发者
索引两表优化案例|学习笔记
快速学习索引两表优化案例
111 0
索引两表优化案例|学习笔记
|
SQL 关系型数据库 MySQL
索引单表优化案例|学习笔记
快速学习索引单表优化案例
124 0
|
SQL 关系型数据库 数据库
案例1:索引优化 | 学习笔记
简介:快速学习案例1:索引优化
|
关系型数据库 MySQL 索引
【MySQL优化】一分钟带你了解三表联查优化
【MySQL优化】一分钟带你了解三表联查优化
839 0
【MySQL优化】一分钟带你了解三表联查优化