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

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

开发者学堂课程【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 的设置。

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
7月前
|
SQL 关系型数据库 MySQL
从理论到实践,Mysql查询优化剖析(联表查询)
从理论到实践,Mysql查询优化剖析(联表查询)
260 0
|
8月前
|
SQL 存储 分布式计算
奇思妙想的SQL|去重Cube计算优化新思路
本文主要分享了作者在蚂蚁集团高管数据链路改造升级过程中,针对去重Cube的优化实践。
854 48
|
5月前
|
SQL 关系型数据库 MySQL
SQL索引构建与优化的神奇之处:如何用高效索引让你的数据检索飞起来?
【8月更文挑战第31天】在现代软件开发中,数据库索引对于提升查询性能至关重要。本文详细介绍了SQL索引的概念、构建方法及优化技巧,包括避免不必要的索引、使用复合索引等策略,并提供了实用的示例代码,如 `CREATE INDEX index_name ON table_name (column_name, another_column_name);`。通过遵循这些最佳实践,如了解查询模式和定期维护索引,可以大幅提高数据检索效率,从而增强应用程序的整体性能。
151 0
|
7月前
|
SQL 关系型数据库 MySQL
Mysql优化之索引相关介绍(笔记)
这段内容涵盖了创建MySQL用户表的SQL语句,创建一个包含`username`、`age`和`dept`字段的联合索引,以及关于联合索引查询时遵循的最左前缀原则的解释。
51 0
|
8月前
|
存储 关系型数据库 MySQL
mysql索引优化,更好的创建和使用索引
mysql索引优化,更好的创建和使用索引
|
8月前
|
SQL 存储 关系型数据库
Mysql索引优化实战一
Mysql索引优化实战一
|
8月前
|
SQL 算法 关系型数据库
MySQL索引优化实战二
MySQL索引优化实战二
|
存储 关系型数据库 MySQL
MySQL基础应用拓展、索引及执行计划
MySQL基础应用拓展、索引及执行计划
91 0
MySQL基础应用拓展、索引及执行计划
|
SQL Oracle 关系型数据库
【SQL开发实战技巧】系列(十三):讨论一下常用聚集函数&通过执行计划看sum()over()对员工工资进行累加
本篇文章讲解的主要内容是:***常用聚集函数及group by与空值的影响、详解通过执行计划看sum()over()分析函数。***
【SQL开发实战技巧】系列(十三):讨论一下常用聚集函数&通过执行计划看sum()over()对员工工资进行累加
|
关系型数据库 MySQL 开发者
索引两表优化案例|学习笔记
快速学习索引两表优化案例
116 0
索引两表优化案例|学习笔记

相关实验场景

更多