加入三张桌子

时间:2015-04-18 13:18:50

标签: mysql sql join insert

我有这个数据库" stats19"包括2005年至2013年英国事故的所有数据

现在我必须创建一个DataWarehouse(星型)。

这是我试图加入一个表格中的表格,省略了一些不重要的其他变量

stats19.casualty(2,020,000行)

AccidentIndex   varchar(13)
VehicleReference    int(11)
CasualtyReference_id    int(11)
CasualtyClass   int(11)
CasualtySeverity    varchar(7)
CasualtySex varchar(28)
CasualtyAgeBand varchar(7)
...

stats19.typeperson(2,020,000行)

CasualtyType_id int(11)
fk_AccidentIndex    varchar(13)
fk_VehicleReference int(11)
fk_CasualtyReference_id int(11)
...

stats19.accident(1,494,275行)

AccidentIndex   varchar(13)
AccidentDate    date
AccidentTime    time
...

决赛桌必须有这个变量

dw.casualtytemporary(应该有202.000行)

AccidentIndex VARCHAR(255),
VehicleReference INT,
CasualtyReference INT,
CasualtyClass INT,
CasualtyType INT,
AccidentDate DATE,
AccidentTime TIME,
CasualtySex VARCHAR(255),
CasualtyAgeBand VARCHAR(255)

我一直试图执行此操作来插入

INSERT INTO CasualtyTemp
    (SELECT c.AccidentIndex,c.VehicleReference,c.CasualtyReference_id,
    c.CasualtyClass,t.CasualtyType_id,a.AccidentDate,a.AccidentTime,
    c.CasualtySex, c.CasualtyAgeBand
    FROM (stats19.Casualty as c 
        INNER JOIN stats19.typeperson as t 
            ON c.CasualtyReference_id = t.cf_CasualtyReference_id
        INNER JOIN stats19.accident as a
            ON a.AccidentIndex = c.AccidentIndex))
);

当MYSQL CommandLine或Workbench通过获取错误(断开连接)或花费太多时间进行插入而导致插入失败时,问题就出现了。

决赛桌dw.casualtytemporary应该有2,020,000行,因为这是原始表格。

1 个答案:

答案 0 :(得分:0)

由于你在没有'where'的情况下进行全表连接,所以我认为搜索复杂度为n1*log(n2)*log(n3),其中ni是每个表的行号(如果你在内连接字段上使用索引)。

我认为你的SQL语句是正确的,而mysql优化器将进一步优化SQL,所以我认为不需要对SQL做。但我认为你可以调整MYSQL部分,我列出了一些可能很重要的内容。

  1. 两个存储引擎应该相同,这可以确保表在引擎级别加入,否则它们将在服务器级别加入,这很慢。

  2. 如果你使用Innodb,也许你可以调整与Inoodb相关的重要参数,比如'Innodb_buffer_pool_size',因为足够的空间会让innodb在内存中做哈希索引。

  3. 如果您使用Myisam引擎,也许您可​​以调整myisam索引大小以确保索引可以加载到内存中。

  4. 此外,由于您将生成派生表,因此tmp_table_size将很重要,如果tmp_table_size很小,myisam表将用作tmp表。另请注意,由于双写日志机制,innodb的写入速度非常慢,当使用insert ... select时会更加糟糕,因为并发插入是禁用的。

  5. 其他因素,例如字段中是否有NULL,如果字段重复,如果是,则可以使用比VARCHAR更快的ENUM。另外注意CHAR比VARCHAR快20%左右,以防磁盘空间不是问题而字符串很短也许可以尝试。

  6. 如果上述所有方法都无法解决您的问题,或者您没有大型机器,因为您只使用三个表,您可以用c / c ++编写一些代码,这是最有效的方法。