博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mysql join优化
阅读量:7071 次
发布时间:2019-06-28

本文共 2255 字,大约阅读时间需要 7 分钟。

http://www.jb51.net/article/50427.htm

七.性能优化

1.显示(explicit) inner join VS 隐式(implicit) inner join

如:

 

复制代码代码如下:
select * from
table a inner join table b
on a.id = b.id;

 

VS

 

复制代码代码如下:
select a.*, b.*
from table a, table b
where a.id = b.id;

 

我在数据库中比较(10w数据)得之,它们用时几乎相同,第一个是显示的inner join,后一个是隐式的inner join。

2.left join/right join VS inner join

尽量用inner join.避免 LEFT JOIN 和 NULL.

在使用left join(或right join)时,应该清楚的知道以下几点:

(1). on与 where的执行顺序

    ON 条件(“A LEFT JOIN B ON 条件表达式”中的ON)用来决定如何从 B 表中检索数据行。如果 B 表中没有任何一行数据匹配 ON 的条件,将会额外生成一行所有列为 NULL 的数据,在匹配阶段 WHERE 子句的条件都不会被使用。仅在匹配阶段完成以后,WHERE 子句条件才会被使用。它将从匹配阶段产生的数据中检索过滤。

所以我们要注意:在使用Left (right) join的时候,一定要在先给出尽可能多的匹配满足条件,减少Where的执行。如:

PASS

 

复制代码代码如下:
select * from A
inner join B on B.name = A.name
left join C on C.name = B.name
left join D on D.id = C.id
where C.status>1 and D.status=1;

 

Great

 

复制代码代码如下:
select * from A
inner join B on B.name = A.name
left join C on C.name = B.name and C.status>1
left join D on D.id = C.id and D.status=1

 

从上面例子可以看出,尽可能满足ON的条件,而少用Where的条件。从执行性能来看第二个显然更加省时。

(2).注意ON 子句和 WHERE 子句的不同

如作者举了一个列子:

 

复制代码代码如下:
mysql> SELECT * FROM product LEFT JOIN product_details
       ON (product.id = product_details.id)
       AND product_details.id=2;
+----+--------+------+--------+-------+
| id | amount | id   | weight | exist |
+----+--------+------+--------+-------+
|  1 |    100 | NULL |   NULL |  NULL |
|  2 |    200 |    2 |     22 |     0 |
|  3 |    300 | NULL |   NULL |  NULL |
|  4 |    400 | NULL |   NULL |  NULL |
+----+--------+------+--------+-------+
4 rows in set (0.00 sec)

 

mysql> SELECT * FROM product LEFT JOIN product_details

       ON (product.id = product_details.id)
       WHERE product_details.id=2;
+----+--------+----+--------+-------+
| id | amount | id | weight | exist |
+----+--------+----+--------+-------+
|  2 |    200 |  2 |     22 |     0 |
+----+--------+----+--------+-------+
1 row in set (0.01 sec)

 

从上可知,第一条查询使用 ON 条件决定了从 LEFT JOIN的 product_details表中检索符合的所有数据行。第二条查询做了简单的LEFT JOIN,然后使用 WHERE 子句从 LEFT JOIN的数据中过滤掉不符合条件的数据行。

(3).尽量避免子查询,而用join

往往性能这玩意儿,更多时候体现在数据量比较大的时候,此时,我们应该避免复杂的子查询。如下:

PASS

 

复制代码代码如下:
insert into t1(a1) select b1 from t2 where not exists(select 1 from t1 where t1.id = t2.r_id); 

 

Great

 

复制代码代码如下:
insert into t1(a1)  
select b1 from t2  
left join (select distinct t1.id from t1 ) t1 on t1.id = t2.r_id   
where t1.id is null;  

转载地址:http://kmhll.baihongyu.com/

你可能感兴趣的文章
手术相关表和手术状态变化值
查看>>
vs调试 LINK : fatal error LNK1104 ...exe
查看>>
SPSS-非参数检验—两独立样本检验 案例解析(转)
查看>>
mysql数据库修改字段类型
查看>>
windows 杀 端口
查看>>
解决无网络yum安装依赖包
查看>>
白话C#:特性(转)
查看>>
Go:定时执行任务time.sleep和time.tick的优劣
查看>>
年薪50万的大数据分析师养成记【摘抄】
查看>>
RCNN、SppNET、Fast RCNN、Faster RCNN
查看>>
类型转换
查看>>
poj 2417 && poj3243(Baby-Step Giant-Step)
查看>>
动画链接
查看>>
序列化
查看>>
BOOL与bool TRUE与true FALSE与false 区别
查看>>
jira
查看>>
elasticsearch rpm 安装
查看>>
Python基础总结(字符串常用,数字类型转换,基本运算符与流程控制)
查看>>
数据预处理——剔除异常值,平滑,归一化
查看>>
Visual stuido 项目路径的奇怪问题
查看>>