我正在寻找有关优化多个自连接或更好的表/数据库设计的建议。
其中一个表格如下(仅限相关的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)
我实际上想要检索更多变量,还可以加入其他表。现在我想知道是否有办法更有效地运行它,或者我是否应采取完全不同的方法,例如在不同的列中使用带有指示符的宽表来避免自连接。
答案 0 :(得分:0)
给定dataID
和countryID
的{{1}}是唯一的,或year
可以多次出现不同的值吗?如果它是独一无二的,你可以试试这样的东西吗?
dataID