提高这种慢查询的性能

时间:2015-07-23 09:34:27

标签: mysql query-performance

我想调整此查询以获得更好的性能。

查询:

SELECT `DeviceRawUsage`.`duration`, `DeviceRawUsage`.`current` 
FROM `epowerg`.`device_raw_usages` AS `DeviceRawUsage`   
WHERE `DeviceRawUsage`.`device_id` = 1 AND 
`DeviceRawUsage`.`outlet_id` = 1 AND 
`DeviceRawUsage`.`duration` >= '2015-06-01 00:00:00' AND 
`DeviceRawUsage`.`duration` <= '2015-06-30 23:59:59';

2 个答案:

答案 0 :(得分:0)

CREATE TABLE `device_raw_usages` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`device_id` int(11) DEFAULT NULL,
`outlet_id` int(11) NOT NULL,
`duration` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`current` float(11,4) DEFAULT NULL,
`voltage` float(11,4) NOT NULL,
`kw_used` float NOT NULL,
`outlet_total_kwh` float(11,4) DEFAULT NULL,
`outlet_kwh_demand_15` float(11,4) DEFAULT NULL,
`outlet_kw_demand_peak` float(11,4) DEFAULT NULL,
`submeter_real_kw` float(11,4) DEFAULT NULL,
`submeter_total_kwh` float(11,4) DEFAULT NULL,
`submeter_kwh_demand_15` float(11,4) DEFAULT NULL,
`submeter_kw_demand_peak` float(11,4) DEFAULT NULL,
`peak_voltage` float(11,2) DEFAULT NULL,
`peak_current` float(11,2) DEFAULT NULL,
`demand` float(11,2) DEFAULT NULL,
`inst_demand` float(11,2) DEFAULT NULL,
`hist_peek_demand` float(11,2) DEFAULT NULL,
`power_factor` float(11,2) DEFAULT NULL,
`crest_factor` float(11,2) DEFAULT NULL,
`frequency` varchar(20) DEFAULT NULL,
`app_power` float(11,2) DEFAULT NULL,
`tot_app_energy` float(11,2) DEFAULT NULL,
`tot_har_dist_vol` float(11,2) DEFAULT NULL,
`tot_har_dist_curr` float(11,2) DEFAULT NULL,
`har_x_dist_v` float(11,2) DEFAULT NULL,
`har_y_dist_v` float(11,2) DEFAULT NULL,
`har_z_dist_v` float(11,2) DEFAULT NULL,
`har_x_dist_c` float(11,2) DEFAULT NULL,
`har_y_dist_c` float(11,2) DEFAULT NULL,
`har_z_dist_c` float(11,2) DEFAULT NULL,
`interval` int(11) NOT NULL,
 PRIMARY KEY (`id`)
)  ENGINE=InnoDB AUTO_INCREMENT=1136511 DEFAULT CHARSET=latin1 |

答案 1 :(得分:0)

要进行优化,请添加复合索引:

INDEX(device_id, outlet_id, duration)

无关评论:

  • FLOAT(m,n)几乎总是错误的做法。请考虑DECIMAL(m,n)或普通FLOAT

  • 这些列真的是最佳的吗?在适当的地方使用NOT NULL

修改

假设您已经构建了表,可以通过执行以下操作添加索引:

ALTER TABLE device_raw_usages ADD INDEX(device_id, outlet_id, duration);

此特定索引有助于您提供的 one SELECT。它可能会或可能不会帮助其他SELECTsHere是关于如何为给定的INDEX撰写“最佳”SELECT的简短手册。