在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美分可能会有所帮助!