数据准备

CREATE TABLE IF NOT EXISTS `class` (

`id` int(10) unsigned NOT NULL AUTO_INCREMENT,

`card` int(10) unsigned NOT NULL,

PRIMARY KEY (`id`)

);

CREATE TABLE IF NOT EXISTS `book` (

`bookid` int(10) unsigned NOT NULL AUTO_INCREMENT,

`card` int(10) unsigned NOT NULL,

PRIMARY KEY (`bookid`)

);

insert into class(card) values(floor(1+(RAND()*20)));

insert into class(card) values(floor(1+(RAND()*20)));

insert into class(card) values(floor(1+(RAND()*20)));

insert into class(card) values(floor(1+(RAND()*20)));

insert into class(card) values(floor(1+(RAND()*20)));

insert into class(card) values(floor(1+(RAND()*20)));

insert into class(card) values(floor(1+(RAND()*20)));

insert into class(card) values(floor(1+(RAND()*20)));

insert into class(card) values(floor(1+(RAND()*20)));

insert into class(card) values(floor(1+(RAND()*20)));

insert into class(card) values(floor(1+(RAND()*20)));

insert into class(card) values(floor(1+(RAND()*20)));

insert into class(card) values(floor(1+(RAND()*20)));

insert into class(card) values(floor(1+(RAND()*20)));

insert into class(card) values(floor(1+(RAND()*20)));

insert into class(card) values(floor(1+(RAND()*20)));

insert into class(card) values(floor(1+(RAND()*20)));

insert into class(card) values(floor(1+(RAND()*20)));

insert into class(card) values(floor(1+(RAND()*20)));

insert into class(card) values(floor(1+(RAND()*20)));

insert into book(card) values(floor(1+(RAND()*20)));

insert into book(card) values(floor(1+(RAND()*20)));

insert into book(card) values(floor(1+(RAND()*20)));

insert into book(card) values(floor(1+(RAND()*20)));

insert into book(card) values(floor(1+(RAND()*20)));

insert into book(card) values(floor(1+(RAND()*20)));

insert into book(card) values(floor(1+(RAND()*20)));

insert into book(card) values(floor(1+(RAND()*20)));

insert into book(card) values(floor(1+(RAND()*20)));

insert into book(card) values(floor(1+(RAND()*20)));

insert into book(card) values(floor(1+(RAND()*20)));

insert into book(card) values(floor(1+(RAND()*20)));

insert into book(card) values(floor(1+(RAND()*20)));

insert into book(card) values(floor(1+(RAND()*20)));

insert into book(card) values(floor(1+(RAND()*20)));

insert into book(card) values(floor(1+(RAND()*20)));

insert into book(card) values(floor(1+(RAND()*20)));

insert into book(card) values(floor(1+(RAND()*20)));

insert into book(card) values(floor(1+(RAND()*20)));

insert into book(card) values(floor(1+(RAND()*20)));

insert into book(card) values(floor(1+(RAND()*20)));

两表关联

左连接优化

1、一个左连接查询

explain select * from class left join book on class.card = book.card;

image.png

两个select的type都是ALL

2、在右表book表的card字段上建立索引

ALTER TABLE `book` ADD INDEX y ( `card`);

3、查看索引情况

SHOW INDEX FROM book

image.png

4、再次查看执行计划

explain select * from class left join book on class.card = book.card;

image.png

往左连接的右表上加索引效果非常理想!

5、删除旧索引,在class表上加上新索引。

DROP INDEX y ON book;

ALTER TABLE `class` ADD INDEX x ( `card`);

查询索引情况

SHOW INDEX FROM book

image.png

6、再次查看执行计划

explain select * from class left join book on class.card = book.card;

image.png

在left join的左表class添加索引,效果并不理想!

右连接优化

1、接着上面的操作,class表里添加了索引。

SHOW INDEX FROM class

image.png

查看执行计划

explain select * from class right join book on class.card = book.card;

image.png

2、将class表和table表调换位置,再次查看执行计划

explain select * from book right join class on class.card = book.card;

image.png

三表关联

1、在上面的表结构和基础上,继续创建一个phone表

CREATE TABLE IF NOT EXISTS `phone` (

`phoneid` int(10) unsigned NOT NULL AUTO_INCREMENT,

`card` int(10) unsigned NOT NULL,

PRIMARY KEY (`phoneid`)

) engine = innodb;

2、book、phone 两表添加索引

ALTER TABLE `book` ADD INDEX y ( `card`);

ALTER TABLE `phone` ADD INDEX z ( `card`);

3、查看执行计划

explain select * from class left join book on class.card=book.card left j

oin phone on book.card = phone.card;

image.png

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

join的优化:

1、小表驱动大表;left join的小表放到左边;因此这里使用class驱动book再是phone ;

2、尽可能减少join语句中的NestedLoop的循环总次数;

3、优先优化NestedLoop的内层循环;

4、保证join语句中“被驱动表”上join条件字段已经被索引(key字段非NULL);

5、当无法保证“被驱动表”的join条件字段被索引且内存资源充足的前提下,不要太吝惜JoinBuffer的设置;修改my.conf文件

结论

多表join添加索引原则:左连接加右表,右连接加左表

不要添加多余的索引

image.png

mysql 多表 三表 删除_mysql 多表join查询索引优化相关推荐

  1. mysql如果存在字段删除_mysql判断表是否存在然后批量删除的操作

    1.在网上找了许久都没有找到判断表是否存在,然后模糊删除的.但是最后找到了一个曲线救国的方法. 需求:删除表中后缀是 _待删除 的表 1.第一步,找到所有的这样的表,并且拼装好删除表的sql Sele ...

  2. 在MySQL中如何有效的删除一个大表?

    在MySQL中如何有效的删除一个大表? Oracle大表的删除: http://blog.itpub.net/26736162/viewspace-2141248/ 在DROP TABLE 过程中,所 ...

  3. 表的插入、更新、删除、合并操作_20_通过表关联删除多张表

    通过表关联删除多张表 需求描述 需求:删除dept表里deptno和temp相同的记录,但数据不可再恢复. 解决方法:这里通过DELETE FROM A,B FROM tableNAME A JOIN ...

  4. linux db2删除表字段命令,DB2 的表在删除字段后 表会挂起 需要执行 reorg命令

    DB2 的表在删除字段后 表会挂起 需要执行 reorg命令 步骤如下: 通过ssh 登陆到 192.168.1.74 数据库所在服务器 工具: Xshell 5 连接之后: 引用 Connectin ...

  5. php mysql多表关联删除_MySQL中多表删除方法

    欢迎进入Linux社区论坛,与200万技术人员互动交流 >>进入 如果您是才接触MySQL数据库的新人,那么MySQL中多表删除是您一定需要掌握的,下面就将为详细介绍MySQL中多表删除的 ...

  6. 【无标题】mysql增加字段和备注_mysql 修改表名,修改字段类型,增加字段,删除字段,添加字段备注,添加索引...

    mysql语句: 1.修改表名: rename table 旧表名 to 新表名; 2.修改字段类型: alter table 表名 modify column 字段名 字段类型(长度) 3.修改字段 ...

  7. mysql创建表有则删除_MySQL创建表和删除表

    创建表 简单的方式 CREATE TABLE person ( number INT(11), name VARCHAR(255), birthday DATE ); 或者是 CREATE TABLE ...

  8. mysql数据库表类型设置_mysql数据库表的类型介绍

    目录 前言 之前我们讲了下载安装数据库,还有如何卸载(虽然直接重装系统就好) 那么现在让我们来讲讲 """ 1.数据库与表的剩余操作 编码配置.引擎介绍 2.数据库字段的 ...

  9. mysql建表影响效率_MySQL建表查询优化技巧

    场景 我用的数据库是mysql5.6,下面简单的介绍下场景 课程表: 数据100条 学生表: 数据70000条 学生成绩表SC 数据70w条 查询目的:查找语文考100分的考生 查询语句: selec ...

最新文章

  1. C++ demo:文本搜索以及'指针的引用'的思考
  2. C# 获取USB设备信息
  3. 基于Python+Django的Kubernetes集群管理平台
  4. Problem B: 故障电灯(light)
  5. wxWidgets:运行时类型信息 (RTTI)
  6. eclipse编辑js卡死解决方案
  7. Oracle data integrator 11g安装配置和一个实例应用指南pdf
  8. 《上市公司信息披露电子化规范》简介
  9. [UE4]暂停游戏、退出游戏、游戏输入模式
  10. arm linux 内存压力测试,嵌入式中如何给内存做压力测试?
  11. 汇编语言属于计算机科学,汇编语言是一种依赖于计算机的低级程序设计语言吗...
  12. android h5 qq登录,Android webview一键登录手机QQ(2018.11)
  13. OpenGL学习---高级光照---法线贴图
  14. 《Learning Enriched Features for Real Image Restoration and Enhancement》
  15. 百城百店 宝瓷林.北京SKP商场品牌店开业
  16. 苹果ipa 安卓apk 和APPX 安全扫码和分析平台
  17. FusionCharts参数简单说明
  18. ZYNQ aurora_8b10b光通信使用
  19. 项目经理和产品经理哪个更有前途?
  20. 谷歌上面滚动条有时候不管用_可以用的谷歌图片搜图软件

热门文章

  1. 连接黑屏_连接百度Carlife后,MMI黑屏了?
  2. 积木赛尔号机器人_《赛尔号大电影7》2019年暑期重磅回归 继《熊出没》之后再掀国产动画浪潮...
  3. redis setnx 原子性_Redis从入门到深入-分布式锁(26)
  4. Xamarin Essentials教程屏幕状态DeviceDisplay
  5. Arduino可穿戴教程Linux平台下安装Arduino IDE
  6. 游戏控制杆OUYA游戏开发快速入门教程
  7. 计算机四级考试操作系统单元题,计算机四级考试操作系统单选练习
  8. mvvm模式和mvc的区别_mvvm 和 mvc 区别?
  9. 科学家解码脑信号以控制机器人假肢
  10. 养狗防老,比养猫强:日本新研究发现养狗有效预防老年人残疾