从左连接

时间:2016-04-06 13:19:42

标签: mysql left-join bigdata

也许有人在这里可以帮助我/暗示如何做一些事情。我们在mySql中使用了2个表,包括MyISAM,utf8。第一个表包含对象的所有注册,秒表包含所有对象以及名称等附加信息。

表1和表2之间的匹配将基于两个表中的代码列。为什么不是id?因为table1正由外部系统填充,所以它不知道它所链接的对象的id。此外,我们可以注册表2中没有的对象,但需要在表1中注册。

表1 - 注册:(+/- 33.000.000行)

+-------------+
| id          |
| code        |
| datetime    |
+-------------+

表2 - 对象:(+/- 55.000行)

+-------------+
| id          |
| code        |
| name        |
| description |
| etc.        |
+-------------+

两个表都在某些列上有索引。常规选择查询很好。它在0.0017秒内创建了32.382.742行的结果。

SELECT * FROM table1 LEFT JOIN table2 on table2.code = table1.code

当我从表1中的列上订购时,仍然可以。它在0.0179秒内创建了32.382.742行的结果。

SELECT * FROM table1 LEFT JOIN table2 on table2.code = table1.code ORDER BY table1.datetime

当我在表2的列上订购时,它非常糟糕。 MySQL的SHOW processlist;显示正在创建一个临时表,并且没有停止300秒,所以我们杀了MySQL。

SELECT * FROM table1 LEFT JOIN table2 on table2.code = table1.code ORDER BY table2.name

还尝试从表2中选择右表,但是这也不会起作用。

如何解决这个/快速得到这个?

2 个答案:

答案 0 :(得分:0)

您正在使用LEFT JOIN,因此DBMS按其默认值排序Table2的列为NULL的行。 不确定这是否与您的问题有关,但您可以尝试像这样扩展ORDER BY子句

SELECT * 
FROM table1 LEFT JOIN table2 on table2.code = table1.code 
ORDER BY table2.name, table1.datetime

或(不确定这是否有效)

SELECT * 
FROM table1 LEFT JOIN table2 on table2.code = table1.code 
ORDER BY ISNULL(table2.name,table1.datetime)

答案 1 :(得分:0)

尝试以下查询:

Select * from
(SELECT * FROM user_product  ORDER BY user_product.user_product_id DESC) as tempPost
LEFT JOIN product_like on (product_like.user_product_id = tempPost.user_product_id)