具有时变关联的数据的最佳表/索引结构

时间:2015-12-02 18:29:44

标签: mysql indexing structure relationship

我公司使用多个数据采集设备(DAQ)来监控测试现场的太阳能电池板输出。每个DAQ都有一个唯一的序列号,每个太阳能电池板都有一个唯一的序列号。有时我们会更换新面板的面板,偶尔DAQ会失败,需要更换具有不同序列号的新面板。

我的问题是,查看特定太阳能电池板序列号的所有数据的查询的最佳表结构是什么,因为它可以在不同的时间在不同的DAQ上?

我目前正在使用以下表结构:

Table: relationships
id int(11) NOT NULL AUTO_INCREMENT,
daqID char(4) NOT NULL,
dtdateFirst datetime NOT NULL,
dtdateLast datetime NOT NULL,
PanelType varchar(20) NOT NULL,
sgcucode varchar(45) NOT NULL,
serial varchar(15) NOT NULL,
ptype varchar(15) NOT NULL,
PRIMARY KEY (id),
KEY daqID (daqID),
KEY gcuidx (sgcucode),
KEY serialidx (serial),
KEY fullidx (sgcucode,daqID,serial,dtdateFirst,dtdateLast)
) ENGINE=InnoDB AUTO_INCREMENT=135 DEFAULT CHARSET=utf8


Table: data
id int(11) NOT NULL AUTO_INCREMENT,
dtdate datetime NOT NULL,
daqID char(4) NOT NULL,
Varray text NOT NULL,
Iarray text NOT NULL,
Iavg float NOT NULL,
Pmp float NOT NULL,
PRIMARY KEY (id),
UNIQUE KEY id_UNIQUE (id),
UNIQUE KEY dupliData (dtdate,daqID,Iavg),
KEY idxDaqDate (daqID,dtdate),
KEY idxDate (dtdate),
KEY idxPmp (Pmp)
) ENGINE=InnoDB AUTO_INCREMENT=14027571 DEFAULT CHARSET=utf8

“relationships”表将daqID与给定时间跨度的面板序列号匹配(从“dtdateFirst”到“dtdateLast”)。所以这个问题的重要列是:daqID,dtdateFirst,dtdateLast,serial。同样重要的是“sgcucode”。此列指示模块所在的测试站点。它由仪表板使用,以便我们可以循环访问将数据记录到同一个表的各个站点。

数据不断从DAQ设备记录到“数据”表中。然后,我使用关系表将太阳能电池板的序列号与相关时间的正确daqID相关联。

到目前为止,最常见的查询是收集给定日期“数据”表中的所有数据,并将其显示在仪表板中(如下所示)。

Dashboard image link

这是我用来执行此操作的查询:

SELECT relationships.serial as title, dtdate as time , Pmp as Value, relationships.ptype as type
FROM data INNER JOIN (relationships) ON (relationships.daqID=data.daqID) 
AND dtdate BETWEEN DATE_FORMAT(example_date, '%Y-%m-%d 05:00:00') AND DATE_FORMAT(example_date, '%Y-%m-%d 21:00:00')
WHERE relationships.dtdateFirst <= dtdate
AND relationships.dtdateLast >= dtdate
AND sgcucode="example_code";

鉴于这些条件,这是最好的解决方案吗?我可能有冗余索引,我仍在学习数据库设计,所以任何改进建议都将非常感谢!

0 个答案:

没有答案