mysql 多表 三表 删除_mysql 多表join查询索引优化
数据准备
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查询索引优化相关推荐
- mysql如果存在字段删除_mysql判断表是否存在然后批量删除的操作
1.在网上找了许久都没有找到判断表是否存在,然后模糊删除的.但是最后找到了一个曲线救国的方法. 需求:删除表中后缀是 _待删除 的表 1.第一步,找到所有的这样的表,并且拼装好删除表的sql Sele ...
- 在MySQL中如何有效的删除一个大表?
在MySQL中如何有效的删除一个大表? Oracle大表的删除: http://blog.itpub.net/26736162/viewspace-2141248/ 在DROP TABLE 过程中,所 ...
- 表的插入、更新、删除、合并操作_20_通过表关联删除多张表
通过表关联删除多张表 需求描述 需求:删除dept表里deptno和temp相同的记录,但数据不可再恢复. 解决方法:这里通过DELETE FROM A,B FROM tableNAME A JOIN ...
- linux db2删除表字段命令,DB2 的表在删除字段后 表会挂起 需要执行 reorg命令
DB2 的表在删除字段后 表会挂起 需要执行 reorg命令 步骤如下: 通过ssh 登陆到 192.168.1.74 数据库所在服务器 工具: Xshell 5 连接之后: 引用 Connectin ...
- php mysql多表关联删除_MySQL中多表删除方法
欢迎进入Linux社区论坛,与200万技术人员互动交流 >>进入 如果您是才接触MySQL数据库的新人,那么MySQL中多表删除是您一定需要掌握的,下面就将为详细介绍MySQL中多表删除的 ...
- 【无标题】mysql增加字段和备注_mysql 修改表名,修改字段类型,增加字段,删除字段,添加字段备注,添加索引...
mysql语句: 1.修改表名: rename table 旧表名 to 新表名; 2.修改字段类型: alter table 表名 modify column 字段名 字段类型(长度) 3.修改字段 ...
- mysql创建表有则删除_MySQL创建表和删除表
创建表 简单的方式 CREATE TABLE person ( number INT(11), name VARCHAR(255), birthday DATE ); 或者是 CREATE TABLE ...
- mysql数据库表类型设置_mysql数据库表的类型介绍
目录 前言 之前我们讲了下载安装数据库,还有如何卸载(虽然直接重装系统就好) 那么现在让我们来讲讲 """ 1.数据库与表的剩余操作 编码配置.引擎介绍 2.数据库字段的 ...
- mysql建表影响效率_MySQL建表查询优化技巧
场景 我用的数据库是mysql5.6,下面简单的介绍下场景 课程表: 数据100条 学生表: 数据70000条 学生成绩表SC 数据70w条 查询目的:查找语文考100分的考生 查询语句: selec ...
最新文章
- C++ demo:文本搜索以及'指针的引用'的思考
- C# 获取USB设备信息
- 基于Python+Django的Kubernetes集群管理平台
- Problem B: 故障电灯(light)
- wxWidgets:运行时类型信息 (RTTI)
- eclipse编辑js卡死解决方案
- Oracle data integrator 11g安装配置和一个实例应用指南pdf
- 《上市公司信息披露电子化规范》简介
- [UE4]暂停游戏、退出游戏、游戏输入模式
- arm linux 内存压力测试,嵌入式中如何给内存做压力测试?
- 汇编语言属于计算机科学,汇编语言是一种依赖于计算机的低级程序设计语言吗...
- android h5 qq登录,Android webview一键登录手机QQ(2018.11)
- OpenGL学习---高级光照---法线贴图
- 《Learning Enriched Features for Real Image Restoration and Enhancement》
- 百城百店 宝瓷林.北京SKP商场品牌店开业
- 苹果ipa 安卓apk 和APPX 安全扫码和分析平台
- FusionCharts参数简单说明
- ZYNQ aurora_8b10b光通信使用
- 项目经理和产品经理哪个更有前途?
- 谷歌上面滚动条有时候不管用_可以用的谷歌图片搜图软件
热门文章
- 连接黑屏_连接百度Carlife后,MMI黑屏了?
- 积木赛尔号机器人_《赛尔号大电影7》2019年暑期重磅回归 继《熊出没》之后再掀国产动画浪潮...
- redis setnx 原子性_Redis从入门到深入-分布式锁(26)
- Xamarin Essentials教程屏幕状态DeviceDisplay
- Arduino可穿戴教程Linux平台下安装Arduino IDE
- 游戏控制杆OUYA游戏开发快速入门教程
- 计算机四级考试操作系统单元题,计算机四级考试操作系统单选练习
- mvvm模式和mvc的区别_mvvm 和 mvc 区别?
- 科学家解码脑信号以控制机器人假肢
- 养狗防老,比养猫强:日本新研究发现养狗有效预防老年人残疾