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

本文涉及的产品
云数据库 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 的设置。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
30天前
|
数据库 索引
联合索引和单独列索引哪个更好
【10月更文挑战第15天】联合索引和单独列索引哪个更好
46 2
|
4月前
|
关系型数据库 MySQL 数据库
MySQL数据库—查询:关联查询(一篇教会你在多表关联下查询数据)
MySQL数据库—查询:关联查询(一篇教会你在多表关联下查询数据)
152 0
|
6月前
|
存储 关系型数据库 MySQL
mysql索引优化,更好的创建和使用索引
mysql索引优化,更好的创建和使用索引
|
存储 关系型数据库 MySQL
MySQL基础应用拓展、索引及执行计划
MySQL基础应用拓展、索引及执行计划
83 0
MySQL基础应用拓展、索引及执行计划
|
NoSQL MongoDB 开发者
索引的使用 涵盖的查询 | 学习笔记
快速学习 索引的使用 涵盖的查询
索引的使用 涵盖的查询 | 学习笔记
|
关系型数据库 MySQL 开发者
索引两表优化案例|学习笔记
快速学习索引两表优化案例
111 0
索引两表优化案例|学习笔记
|
关系型数据库 MySQL 数据库
MySQL数据库:第十一章:合并查询(联合查询)
MySQL数据库:第十一章:合并查询(联合查询)
|
存储 SQL 关系型数据库
索引到底能提升多少查询效率?何时该使用索引?一文快速搞懂数据库索引及合理使用它
索引到底能提升多少查询效率?何时该使用索引?一文快速搞懂数据库索引及合理使用它
665 0
索引到底能提升多少查询效率?何时该使用索引?一文快速搞懂数据库索引及合理使用它
|
SQL 关系型数据库 MySQL
索引单表优化案例|学习笔记
快速学习索引单表优化案例
124 0
|
SQL 缓存 监控
列表查询的通用优化方案
> 列表查询是服务端开发中非常高频的诉求,接口的性能往往会跟用户体验强关联。本文通过一个具体的例子,来总结服务端写查询接口时的通用优化方案。 ## 一个例子 ### 功能诉求 给出一个具体的例子,背景是根据内容ID来查询内容信息(如下),目标是通过编码优化使得这个查询效率变快,减少上游(客户端App或外部服务)的等待时间。 ```java public interfa
1354 2
列表查询的通用优化方案