优化多个自JOIN或重新设计DB?

时间:2013-06-02 17:47:37

标签: mysql database-design join self-join

我正在寻找有关优化多个自连接或更好的表/数据库设计的建议。

其中一个表格如下(仅限相关的cols):

CREATE TABLE IF NOT EXISTS CountryData (
  countryDataID INT PRIMARY KEY AUTO_INCREMENT,
  dataID INT NOT NULL REFERENCES DataSources (dataID),
  dataCode VARCHAR(30) NULL,
  countryID INT NOT NULL REFERENCES Countries (countryID),
  year INT NOT NULL ,
  data DEC(20,4) NULL,
  INDEX countryDataYear (dataID, countryID, year));

data列包含数百个指标,90个国家/地区的值,以及总共约100万行的30年值。标准查询需要为特定年份和C国家选择N个指标,从而产生最多90行的CxN表。

将所有值放在一列中,自连接似乎就是要走的路。所以我已经尝试了各种建议来加快这些速度,包括索引和创建新的(临时)表。在9个自联接中,查询需要不到1分钟。除此之外,它永远旋转。

发生自连接的新表只有大约1,000行,索引似乎是相关的变量 - 创建大约需要0.5秒:

CREATE TABLE Growth
    SELECT dataID, countryID, year, data
    FROM CountryData
    WHERE dataID > 522 AND year = 2017;

CREATE INDEX growth_ix 
    ON Growth (dataID, countryID);

然后SELECT查询会在结果表中排列最多XX个指标,但不幸的是XX <10:

SELECT 
    Countries.countryName AS Country,   
    em01.em,
    em02.em,
    em03.em
    ...
    emX.em
FROM    
    (SELECT
        em1.data AS em,
        em1.countryID
    FROM Growth AS em1
    WHERE
    em1.dataID = 523) as em01
    JOIN 
    (SELECT
        em2.data AS em,
        em2.countryID
    FROM Growth AS em2
    WHERE
    em2.dataID = 524) as em02
    USING (countryID)
    JOIN
    (SELECT
        em3.data AS em,
        em3.countryID
    FROM Growth AS em3
    WHERE
    em3.dataID = 525) as em03
    USING (countryID)
    ...
    JOIN
    (SELECT
        emX.data AS em,
        emX.countryID
    FROM Growth AS em5
    WHERE
    emX.dataID = 527) as emXX
    USING (countryID)
    JOIN Countries 
    USING (countryID)

我实际上想要检索更多变量,还可以加入其他表。现在我想知道是否有办法更有效地运行它,或者我是否应采取完全不同的方法,例如在不同的列中使用带有指示符的宽表来避免自连接。

1 个答案:

答案 0 :(得分:0)

给定dataIDcountryID的{​​{1}}是唯一的,或year可以多次出现不同的值吗?如果它是独一无二的,你可以试试这样的东西吗?

dataID