比较" 2连接和1联盟之间的查询效率"和#34; 1大INNER加入"

时间:2016-10-02 22:58:05

标签: mysql join union mysql-slow-query-log

在mysql Distrib 5.5.49中,这里的目标是从输入表0 有效地生成表C 表0 需要一些计算来生成表A ,并且表B 将加入表C

然而,整个过程对于大联盟来说有点慢。因此,我们正在努力回收"当具有不同ID的数据内容相同时,数据(复制除ID列之外的所有列),希望新方法更有效。但是,在下面的测试集和pseduo代码中,我们发现旧方法实际上比新的回收数据方法快约50%。

Old approach (one INNER JOIN on bigger tables): 

Input: 
Table 0, which contains 2,000 rows. Some calculation processes will
      generate 1 million rows Table A from Table 0.

Then

1 million rows Table A
    INNER JOIN
200K rows Table B
    On ID column, which are indexed in both Table A & Table B 
=> generate 2 million rows Table C

------------------------------
New approach: (separate inputs , INNER JOIN on smaller tables,
     then UNION and RIGHT JOIN on smaller tables to get bigger tables)

Input: Separate Table 0 into 

Table 1, 1,000 rows.  Some calculation processes will generate
     1 million rows Table A from Table 0.

Table 2: 2,000 rows 

Create Table C AS (
0.5 million rows Table A 
INNER JOIN 
200K rows Table B 
    On ID column, which are indexed in both Table A & Table B)
=> generate 0.6 million rows Table C;

Create Table D AS ( 
    0.6 million rows Table C 
UNION 
    1000 rows Table 2
    RIGHT JOIN 0.6 million rows Table C 
    On ID column, which are indexed in both Table A & Table B
=> generate 2 million rows Table D);

DROP TABLE 0.6 million rows C ();

ALTER TABLE TABLE D RENAME TO TABLE C; 

这里提供了新方法的SQL小提琴(http://sqlfiddle.com/#!9/91c1cf/5

任何一位大师都能就如何优化新方法提出一些意见吗?

我假设当输入文件(表0)具有更多复制数据时,新方法可能会更快,我们可以将它们分开并回收它们。但是,当我们使用更大的输入进行测试时,系统会不断出现错误消息:

Incorrect key file for table '/tmp/#sql_3c51_0.MYI'; try to repair it

根据这篇文章,此错误消息表示系统没有足够的/ tmp文件夹用于临时表。

Incorrect key file for table '/tmp/#sql_3c51_0.MYI'; try to repair it

我仍在尝试按照这篇文章中的说明进行操作。任何2美分可能会有所帮助!

0 个答案:

没有答案