BY ifadesi oluşturulan GROUP ile bir SQL sorgusu optimize

0 Cevap php

Ben bu sorgu var:

   SELECT ROUND(AVG(temp)*multT + conT,2) as temp,
          FLOOR(timestamp/$secondInterval) as meh
     FROM sensor_locass
LEFT JOIN sensor_data USING(sensor_id)
    WHERE sensor_id = '$id'
      AND project_id = '$project'
 GROUP BY meh
 ORDER BY timestamp ASC

Amaçlı I verilere grafik sadık yapmak için bir veri piksel değerinde üzerinde ortalamasını kullanın, bir grafik çizim için verileri seçmek için.

Şimdiye kadar optimizasyon MyISAM ve InnoDB ama hayır şans arasındaki geçiş, dizinleri ekleme dahil etmiştir.

Grafik zoom ve veri toplama süresi ile zaman aralığı değişiklikleri beri GROUP BY deyimi için ayrı bir sütun yapamazsınız, sorgu ancak yavaş. Herkes bu hızlı gruplandırma yapmak için bu sorguyu veya tabloyu optimize etmek için bir fikir var mı, ben şu anda timestamp, sensor_id ve project_id sütunlar, üzerinde bir dizin var timestamp göstergesi ancak kullanılmaz.

Sorgusu ile explain extended çalıştırırken ben şu olsun:

1   SIMPLE  sensor_locass   ref     sensor_id_lookup,project_id_lookup  sensor_id_lookup    4   const                               2       100.00  Using where; Using temporary; Using filesort
1   SIMPLE  sensor_data     ref     idsensor_lookup idsensor_lookup                         4   webstech.sensor_locass.sensor_id    66857   100.00

sensor_data masa i ile çalışmak zorunda sona erecek veri miktarının sadece küçük bir kısmını şu an 2,7 milyon veri noktası olarak içerir. Herhangi bir yardımcı fikir, yorum veya çözüm en hoş olurdu

EDIT table definitions:

CREATE TABLE `sensor_data` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `gateway_id` int(11) NOT NULL,
 `timestamp` int(10) NOT NULL,
 `v1` int(11) NOT NULL,
 `v2` int(11) NOT NULL,
 `v3` int(11) NOT NULL,
 `sensor_id` int(11) NOT NULL,
 `temp` decimal(5,3) NOT NULL,
 `oxygen` decimal(5,3) NOT NULL,
 `batVol` decimal(4,3) NOT NULL,
 PRIMARY KEY (`id`),
 KEY `gateway_id` (`gateway_id`),
 KEY `time_lookup` (`timestamp`),
 KEY `idsensor_lookup` (`sensor_id`)
) ENGINE=MyISAM AUTO_INCREMENT=2741126 DEFAULT CHARSET=latin1

CREATE TABLE `sensor_locass` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `project_id` int(11) NOT NULL,
 `sensor_id` int(11) NOT NULL,
 `start` date NOT NULL,
 `end` date NOT NULL,
 `multT` decimal(6,3) NOT NULL,
 `conT` decimal(6,3) NOT NULL,
 `multO` decimal(6,3) NOT NULL,
 `conO` decimal(6,3) NOT NULL,
 `xpos` decimal(4,2) NOT NULL,
 `ypos` decimal(4,2) NOT NULL,
 `lat` decimal(9,6) NOT NULL,
 `lon` decimal(9,6) NOT NULL,
 `isRef` tinyint(1) NOT NULL,
 PRIMARY KEY (`id`),
 KEY `sensor_id_lookup` (`sensor_id`),
 KEY `project_id_lookup` (`project_id`)
) ENGINE=MyISAM AUTO_INCREMENT=238 DEFAULT CHARSET=latin1

0 Cevap