2015-07-23 9 views
0

Я хочу настроить этот запрос для лучшей производительности.улучшить производительность этого медленного запроса

Запрос:

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'; 
+0

Возможно, стоит добавить 'LIMIT' к числу результатов, которые вы хотите вернуть - если это применимо для этого сценария. То есть если вы хотите 10 результатов: добавьте 'LIMIT 10' в конец запроса. – user3065931

+0

@ user3065931 Я не могу его ограничить. Я хочу, чтобы запрос настраивался столько, сколько он есть. каким-либо другим способом я могу сделать этот запрос эффективным? – Prabakaran

+1

У вас есть индексы, определенные для ваших столбцов 'device_id',' outlet_id' и т. Д.? – cars10m

ответ

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 | 
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); 

Этот конкретный индекс является полезным для однойSELECT вы предоставили , Он может или не может помочь другим SELECTs. Here - краткая поваренная книга о том, как написать «лучший» INDEX для данного SELECT.

+0

Вы можете использовать индекс по запросу и опубликовать его. Я новичок в этом. я хотел бы знать, как вы это делаете .. и я буду подразумевать свои другие вопросы. – Prabakaran

Смежные вопросы