这篇博文讲述如何优化内循环的次数。内循环的次数受驱动表的记录数所影响,驱动表记录数越多,内循环就越多,连接效率就越低下,所以尽量用小表驱动大表。先插入测试数据。

CREATE TABLE t1 (

id INT PRIMARY KEY AUTO_INCREMENT,

type INT

);

SELECT COUNT(*) FROM t1;

+----------+

| COUNT(*) |

+----------+

| 10000 |

+----------+

CREATE TABLE t2 (

id INT PRIMARY KEY AUTO_INCREMENT,

type INT

);

SELECT COUNT(*) FROM t2;

+----------+

| COUNT(*) |

+----------+

| 100 |

+----------+

内连接谁当驱动表

实际业务场景中,左连接、右连接可以根据业务需求认定谁是驱动表,谁是被驱动表。但是内连接不同,根据嵌套循环算法的思想,t1内连接t2和t2内连接t1所得结果集是相同的。那么到底是谁连接谁呢?谨记一句话即可,小表驱动大表可以减小内循环的次数。

下面用STRAIGHT_JOIN强制左表连接右表。By the way,STRIGHT_JOIN比较冷门,在这里解释下,其作用相当于内连接,不过强制规定了左表驱动右边。

EXPLAIN SELECT * FROM t1 STRAIGHT_JOIN t2 ON t1.type=t2.type;

+----+-------+------+------+-------+----------------------------------------------------+

| id | table | type | key | rows | Extra |

+----+-------+------+------+-------+----------------------------------------------------+

| 1 | t1 | ALL | NULL | 10000 | NULL |

| 1 | t2 | ALL | NULL | 100 | Using where; Using join buffer (Block Nested Loop) |

+----+-------+------+------+-------+----------------------------------------------------+

EXPLAIN SELECT * FROM t2 STRAIGHT_JOIN t1 ON t2.type=t1.type;

+----+-------+------+------+-------+----------------------------------------------------+

| id | table | type | key | rows | Extra |

+----+-------+------+------+-------+----------------------------------------------------+

| 1 | t2 | ALL | NULL | 100 | NULL |

| 1 | t1 | ALL | NULL | 10000 | Using where; Using join buffer (Block Nested Loop) |

+----+-------+------+------+-------+----------------------------------------------------+

对于第一条查询语句,t1是驱动表,其有10000条记录,内循环也就有10000次,这还得了?

对于第二条查询语句,t2是驱动表,其有100条记录,内循环100次,感觉不错,我喜欢!

这些SQL语句的执行时间也说明了,当内连接时,务必用小表驱动大表。

最佳实践:直接让MySQL去判断

但是,表的记录数是会变化的,有没有一劳永逸的写法?当然有啦,MySQL自带的Optimizer会优化内连接,优化策略就是上面讲的小表驱动大表。所以,以后写内连接不要纠结谁内连接谁了,直接让MySQL去判断吧。

EXPLAIN SELECT * FROM t1 INNER JOIN t2 ON t1.type=t2.type;

EXPLAIN SELECT * FROM t2 INNER JOIN t1 ON t1.type=t2.type;

EXPLAIN SELECT * FROM t1 JOIN t2 ON t1.type=t2.type;

EXPLAIN SELECT * FROM t2 JOIN t1 ON t1.type=t2.type;

EXPLAIN SELECT * FROM t1,t2 WHERE t1.type=t2.type;

EXPLAIN SELECT * FROM t2,t1 WHERE t1.type=t2.type;

+----+-------+------+------+--------+----------------------------------------------------+

| id | table | type | key | rows | Extra |

+----+-------+------+------+--------+----------------------------------------------------+

| 1 | t2 | ALL | NULL| 100 | NULL |

| 1 | t1 | ALL | NULL | 110428 | Using where; Using join buffer (Block Nested Loop) |

+----+-------+------+------+--------+----------------------------------------------------+

上面6条内连接SQL,MySQL的Optimizer都会进行优化。

mysql join 循环_MySQL的JOIN(三):JOIN优化实践之内循环的次数相关推荐

  1. mysql数据库交叉连接_MySQL交叉连接(CROSS JOIN)

    在本教程中,您将了解MySQL CROSS JOIN子句以及如何应用它来解决一些有趣的数据问题. MySQL CROSS JOIN子句简介 CROSS JOIN子句从连接的表返回行的笛卡儿乘积. 假设 ...

  2. mysql 全连接_MySQL全连接(Full Join)实现,union和union all用法

    MySQL本身不支持你所说的full join(全连接),但可以通过union来实现 , 下面是一个简单测试,可以看看: mysql> CREATE TABLE a(id int,name ch ...

  3. mysql useing查询_mysql explain语法详解--优化你的查询

    先解析一条sql语句,看出现什么内容 EXPLAINSELECTs.uid,s.username,s.name,f.email,f.mobile,f.phone,f.postalcode,f.addr ...

  4. Mysql join效率_mysql 子查询与join性能对比

    有如下的数据表: application_daily 11万条数据 application_info400多条数据 查询结果数据为19498 来看下mysql 子查询的例子. 例1,子查询 (0.01 ...

  5. mysql分析日志_MYSQL 索引(三)--- SQL日志分析

    慢查询日志 Mysql 的慢查询日志是 Myql 提供的一种日志记录,用来记录在 Myql 中响应时间查过阈值的语句,具体指运行时间超过 long_query_time 值的 SQL,则会被记录在日志 ...

  6. MySQL数据类型特征_Mysql学习(三)数据类型_mysql

    mysql学习(3)数据类型 数据类型 数据类型是指.存储过程参数.表达式和局部变量的数据特征, 它决定了数据的存储格式,代表了不同的信息类型. 整型 Tinyint      有符号位 -128到1 ...

  7. mysql 内存引擎_MySQL常见的三种存储引擎(InnoDB、MyISAM、MEMORY)

    MySQL是我们经常使用的数据库处理系统(DBMS),不知小伙伴们有没有注意过其中的"存储引擎"(storage_engine)呢?有时候面试题中也会问道MySQL几种常用的存储引 ...

  8. mysql快速入门_MySQL快速入门(三)

    1. 性能优化 1.1  MySQL索引 什么是索引? 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含 着对数据表里所有记录的引用指针.更通俗的说,数据库索引好比是 ...

  9. mysql安装方法_MySQL安装的三种方式

    MySQL安装的三种方式 Mysql安装方式对比 安装方式 安装简易度 使用简易度 定制化程度 适合范围 rpm包安装 简单 简单 低 仅适合redhat/centos系列linux 二进制安装 安装 ...

最新文章

  1. java Windows7 下环境变量设置
  2. 关于sigma pix的理解
  3. 将十六进制的字符串转化为UIImage
  4. Perfect Permutation
  5. codesys 简单案例_第一章:初识Codesys-1.4从一个示例程序讲起
  6. mysql查询前100行和后100行
  7. (TOJ1531)爱的伟大意义
  8. go去掉最后一个字符_Go:字符串操作
  9. Screaming Frog SEO Spider的11个鲜为人知的功能
  10. 【科普】你所不了解的SWF文件
  11. 在consul中删除服务
  12. 【生活中的逻辑谬误】以暴制暴和压制理性
  13. 什么是网站死链?如何查询网站死链?网站死链怎么解决?
  14. Sketch 快捷键(UE图、思维图、UI设计、矢量设计图)
  15. Idea--git合并多次commit为一个(合并提交)--实例
  16. 【已解决】ThinkPad E440 Win7蓝牙无法连接
  17. 基于无线lora通信实现远程采集输出0~10v,0~20ma模拟量信号以及开关量信号
  18. 从简单工厂到抽象工厂
  19. 免费且不丢失数据的MBR转GPT软件!
  20. 浅谈3D网游引擎变迁史 看国产游戏引擎趋势

热门文章

  1. 基于node的登入例子(node-koa-mongoose)
  2. 在shop++二次开发中金额数据类型BigDecimal转换,注意细节。
  3. nagios监控安装及设置案例
  4. git 删除和复制远程分支
  5. tomcat启动之后,Chrome浏览器可以访问,IE不行(IE无法访问8080 端口)
  6. 洛谷 P1396 营救
  7. 针对xml文件做提取与写入的操作
  8. [第一章]一、面向对象思想的发展
  9. HoloLens开发手记 - 使用混合现实捕捉 Using mixed reality capture
  10. 12月3号 命名规范和运算符的使用