关于full join 语句的性能问题 跪求大虾帮忙解决.

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于full join 语句的性能问题 跪求大虾帮忙解决.相关的知识,希望对你有一定的参考价值。

select m.*,row_number() over(partition by xxxx by yyy desc nulls last) sn
from(
a full join b

)m where sn<=100

a和b都为数据量5万条左右的表 为什么这样执行起来很慢

参考技术A a full join b

你的关联条件呢?

没有关联条件,就是 5万 × 5万 的数据量啊!!!

关联条件一定要写在sql中才行啊。
参考技术B 用full join之后,数据结果会是
a和b能关联上的数+a表中不存在于b表中的数+b表中不存在于a表中的数的一个结果集,
同时在做full join的时候会对两个表做全表扫,
之后还要进行
row_number() over(partition by xxxx by yyy desc nulls last)计算
肯定是不会很快的。

MySQL:FULL OUTER JOIN - 如何合并一列?

【中文标题】MySQL:FULL OUTER JOIN - 如何合并一列?【英文标题】:MySQL: FULL OUTER JOIN - How do I merge one column? 【发布时间】:2011-05-23 20:11:04 【问题描述】:

我有一个关于 MySQL 中的 FULL OUTER JOIN 的问题。我有两张(或更多张桌子):

表 1 表 2 id 值 id 值2 1个1个 2 天 3 天 3 e 4 f

我已使用此查询来获取我的加入:

SELECT * 
FROM table1
LEFT OUTER JOIN table2
ON table1.`id`=table2.`id`
UNION
SELECT * 
FROM table1
RIGHT OUTER JOIN table2
ON table1.`id`=table2.`id`

得到:

标识值 1 标识值 2 1个1个 2 c 空空 3 天 3 天 NULL NULL 4 f

我的问题是我无法同时将两个 id 列折叠成一列来得到这个:

id 值1 值2 1个 2 c 空 3 天 4 空 f

有什么建议吗?

【问题讨论】:

【参考方案1】:
SELECT 
COALESCE(t1.id, t2.id) as id,
t1.value1,
t2.value2
FROM table1 t1
FULL JOIN table2 t2 ON t1.id = t2.id;

【讨论】:

同意.. COALESCE 就是我想要的! 简短而完美的答案!【参考方案2】:

用途:

    SELECT t1.id,
           t1.value,
           t2.value2 
      FROM table1 t1
 LEFT JOIN table2 t2 ON t2.id = t1.id
UNION
    SELECT t2.id,
           t1.value,
           t2.value2
      FROM TABLE1 t1
RIGHT JOIN TABLE2 t2 ON t2.id = t1.id

UNION 运算符删除行/记录重复项,因此您必须适当地定义/列出列。

脚本:

DROP TABLE IF EXISTS `example`.`table1`;
CREATE TABLE  `example`.`table1` (
  `id` int(10) unsigned NOT NULL default '0',
  `value` varchar(45) NOT NULL default ''
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO table1 VALUES (1, 'a'), (2, 'c'), (3, 'e');

DROP TABLE IF EXISTS `example`.`table2`;
CREATE TABLE  `example`.`table2` (
  `id` int(10) unsigned NOT NULL default '0',
  `value2` varchar(45) NOT NULL default ''
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO table2 VALUES (1, 'b'), (3, 'd'), (4, 'f');

编辑:上面的固定线

【讨论】:

非常感谢您提供的非常迅速和有用的回答。这完全解决了我的问题。 如果我必须在 sqlite 上执行此操作怎么办。它支持左连接?【参考方案3】:

对于我认为您正在尝试做的事情,我建议您改用 FULL OUTER JOIN:

SELECT ISNULL(t1.id, t2.id) AS id, t1.value1, t2.value2
FROM table1 t1
FULL OUTER JOIN table2 t2 ON t1.id = t2.id

【讨论】:

这将返回 1064 - 语法错误,因为 MySQL 不支持 FULL OUTER JOIN - 这就是 OP 不使用它的原因。 正如 OMG Ponies 所说,不幸的是 MySQL 不支持 FULL OUTER JOIN 语法,它必须通过不同的方式进行模拟。我发现这很有帮助:xaprb.com/blog/2006/05/26/how-to-write-full-outer-join-in-mysql

以上是关于关于full join 语句的性能问题 跪求大虾帮忙解决.的主要内容,如果未能解决你的问题,请参考以下文章

模拟 FULL OUTER JOIN:LEFT+RIGHT JOIN 与交叉连接的 UNION 性能

mysql的几种join 及 full join 问题

sql语句中的full join具体是怎么回事啊?

请有各位大虾帮我分析下面关于LINUX文件系统编程的代码,然后回答几个问题?

关于Mysql使用left join写查询语句执行很慢的问题解决

谁有卡吧斯基的序列号,跪求各位大虾...