0

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

其中一张表如下所示(仅相关列):

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 个国家和 30 年的值,总计约 100 万行。标准查询需要为特定年份和 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)

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

4

1 回答 1

0

dataID给定的唯一性是唯一的countryIDyear还是可以dataID以不同的值出现多次?如果它是独一无二的,你也许可以尝试这样的事情?

SELECT countryID, year
    ,MAX( CASE WHEN dataID = 523 THEN data ELSE NULL END ) AS em0 
    ,MAX( CASE WHEN dataID = 524 THEN data ELSE NULL END ) AS em1 
    ,...
FROM CountryData
GROUP BY countryID, year 
于 2013-06-02T21:01:24.747 回答