mySQL连接多个表(4)和数据透视

时间:2019-02-14 16:50:35

标签: mysql pivot schema

编辑3: 我通过以下方式进行了一些改进:

  1. 使用了具有更高处理能力的服务器(2-> 4核等)

  2. 对联接的每个语句进行过滤:

    From tblLaps
    inner join tblSectorsInLap on fk_LapPoint = id_tblLaps 
    AND tblLaps.eventid = 22
    AND LapTime > 30
    inner join tblTrackSectorDefinition ON fk_SegmentEntry = tblSegmentDataID
    inner join tblSectorMetrics on id_tblSectorsInLap = fk_segmentpoint
    

MAX语句是否是正确的Pivot方法?还是有其他可能会“更好”的东西?

根据反馈修改2:

SQLFiddle这代表了我的架构(略有简化),带有一些示例数据。

查询为我提供了我想要的输出。 当插入真实数据并且有大约50,000个“轨道”时,这会在tblmetricpoint中导致约18,000,000个条目,并且查询开始花费数百秒的时间(这似乎太长了)

我在下面留下了原始信息:


我有以下查询:

Select concat(DeviceType, ' ', DeviceSerialNumber ) As DeviceName, LapCount, Round(LapTime, 3) AS LapTime
, MAX(CASE WHEN MetricChannel = 'EnergyIncrementingCounter' AND MetricType = 6 AND SegmentNumber = 0 THEN MetricValue END) AS EnergyIncrementingCounter_Diff
, MAX(CASE WHEN MetricChannel = 'EnergyIncrementingCounter' AND MetricType = 3 AND SegmentNumber = 0  THEN MetricValue END) AS EnergyIncrementingCounter_Max
, MAX(CASE WHEN MetricChannel = 'ConditionOfTheTrack' AND MetricType = 1 AND SegmentNumber = 0  THEN MetricValue END) AS ConditionOfTheTrack_Ave
, MAX(CASE WHEN MetricChannel = 'b_InPitLaneCrossed' AND MetricType = 3 AND SegmentNumber = 0  THEN MetricValue END) AS PitIn
, MAX(CASE WHEN MetricChannel = 'b_OutPitLaneCrossed' AND MetricType = 3 AND SegmentNumber = 0  THEN MetricValue END) AS PitOut
, MAX(Case WHEN MetricChannel = 'MotorEfficiency' AND MetricType = 1 AND SegmentNumber = 13 THEN MetricValue END) AS MotorEfficiency_p1_AVE
, MAX(Case WHEN MetricChannel = 'MotorEfficiency2' AND MetricType = 1 AND SegmentNumber = 13 THEN MetricValue END) AS MotorEfficiency2_p1_AVE
, MAX(Case WHEN MetricChannel = 'MotorEfficiency' AND MetricType = 1 AND SegmentNumber = 17 THEN MetricValue END) AS MotorEfficiency_p2_AVE
, MAX(Case WHEN MetricChannel = 'MotorEfficiency2' AND MetricType = 1 AND SegmentNumber = 17 THEN MetricValue END) AS MotorEfficiency2_p2_AVE
 From tblLaps
 left join tblSectorsInLap on fk_LapPoint = id_tblLaps
 left join tblTrackSectorDefinition ON fk_SegmentEntry = tblSegmentDataID
 left join tblSectorMetrics on id_tblSectorsInLap = fk_segmentpoint
 WHERE tblLaps.eventid = 22
 GROUP BY id_tblLaps
 HAVING min(EnergyIncrementingCounter_Diff) >= 0 AND LapTime > 30

对于eventid = 20(在tblSectorMetrics中具有少量记录),此方法相当有效。但是,如果我有大量记录,请说80,000,000(以tblSectorMetrics为单位)。当限制为2,000条记录时,查询的持续时间为11秒,而Fetch(MySQL Workbench)的查询时间为75秒。如果我不限制结果的数量,我会获得约70,000条记录,并且花费了将近一个小时的时间,然后将结果集导出为CSV,即约10 MB。

我的问题是:是否有更好的方法来组织我的SQL查询,以免花费很长时间?

我的其他问题:是否有更好的方法来获取结果(存储的proc / view等)?

我的第三个问题:关于架构,我应该考虑更改吗?

我在SQL方面没有很强的背景,我是从该网站上的几篇文章构建上述查询的,所以我不确定是否错过了一些对我有帮助的基本知识

表说明:

 tblLaps:
 'id_tblLaps', 'int(11)', 'NO', 'PRI', NULL, 'auto_increment'
'DeviceType', 'varchar(10)', 'NO', '', NULL, ''
'DeviceSerialNumber', 'varchar(10)', 'NO', '', NULL, ''
'LapCount', 'int(11)', 'NO', '', NULL, ''
'LapTime', 'double', 'NO', '', NULL, ''
'Driver', 'varchar(45)', 'YES', '', NULL, ''
'eventid', 'int(11)', 'NO', 'MUL', NULL, ''

tblSectorsInLap:
'id_tblSectorsInLap', 'int(11)', 'NO', 'PRI', NULL, 'auto_increment'
'fk_SegmentEntry', 'int(11)', 'NO', 'MUL', NULL, ''
'TimeSegmentStarted', 'datetime', 'YES', '', NULL, ''
'TrackCondition', 'int(11)', 'YES', '', NULL, ''
'fk_LapPoint', 'int(11)', 'NO', 'MUL', NULL, ''

tblTrackSectorDefinition:
'id_tblTrackSectorDefinition', 'int(11)', 'NO', 'PRI', NULL, 'auto_increment'
'EventID', 'int(11)', 'NO', 'MUL', NULL, ''
'StartDistance', 'double', 'NO', '', '0', ''
'EndDistance', 'double', 'NO', '', '0', ''
'SegmentName', 'varchar(45)', 'YES', '', 'Segment Name Goes Here', ''
'SegmentNumber', 'int(4)', 'YES', '', NULL, ''

tblSectorMetrics:
'MetricType', 'int(11)', 'NO', 'MUL', NULL, ''
'MetricValue', 'double', 'YES', '', NULL, ''
'tblInstanceID', 'int(11)', 'NO', 'PRI', NULL, 'auto_increment'
'MetricChannel', 'mediumtext', 'NO', '', NULL, ''
'fk_SegmentPoint', 'int(11)', 'NO', 'MUL', NULL, ''

0 个答案:

没有答案