我正在寻找有关优化多个自联接或更好的表/数据库设计的建议。
其中一张表如下所示(仅相关列):
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)
我实际上想检索更多变量,并可能加入其他表。现在我想知道是否有一种方法可以更有效地运行它,或者我是否应该采取完全不同的方法,例如在不同列中使用带有指示器的宽表来避免自连接。