센서, 판독 값 및 판독 값을 나타내는 시간 스탬프를 나타내는 측정 값 데이터베이스가 있습니다. 측정 값은 변경 사항이있을 때만 기록됩니다. 각 센서가 특정 측정 값을 읽는 범위를 보여주는 결과 세트를 생성하려고합니다.MySQL - 데이터 포인트를 범위로 바꾸기
타임 스탬프는 밀리 초 단위이지만 결과는 몇 초 만에 출력됩니다. 내가 서브 쿼리를 사용하여 원하는 결과를 얻고 지금
CREATE TABLE `raw_metric` (
`row_id` BIGINT NOT NULL AUTO_INCREMENT,
`sensor_id` BINARY(6) NOT NULL,
`timestamp` BIGINT NOT NULL,
`angle` FLOAT NOT NULL,
PRIMARY KEY (`row_id`)
)
하지만 데이터 포인트를 많이있을 때 그것은 매우 느린입니다 : 여기
는 테이블의SELECT row_id,
HEX(sensor_id),
angle,
(
COALESCE((
SELECT MIN(`timestamp`)
FROM raw_metric AS rm2
WHERE rm2.`timestamp` > rm1.`timestamp`
AND rm2.sensor_id = rm1.sensor_id
), UNIX_TIMESTAMP() * 1000) - `timestamp`
)/1000 AS duration
FROM raw_metric AS rm1
는 본질적으로 , 범위를 얻으려면, 나는 다음 독서를 얻을 필요가있다 (또는 다른 독서가 없으면 현재 시간을 사용한다). 부속 조회는 현재 시간보다 늦지 만 동일한 센서의 최소 시간 소인을 찾습니다.
이 쿼리는 자주 발생하지 않으므로 타임 스탬프 열에 인덱스를 추가하고 삽입 속도를 늦출 필요가 없습니다. 나는 누군가가 이것을하는 대안적인 방법에 대한 제안을 가지기를 바랬다.
UPDATE : ROW_ID의 타임 스탬프와 함께 증가해야하지만이 때문에 네트워크 지연 문제로 보장 할 수 없습니다. 따라서 row_id가 낮은 항목이 나중에 row_id 이후에 발생하는 것은 가능하지만 가능성은 없습니다.
이 하위 쿼리의 성능을 향상시키는 적절한 방법은 raw_metric (sensor_id, timestamp)에 인덱스를 지정하는 것입니다. 색인을 추가하고 삽입의 성능을 테스트하는 것이 좋습니다. –
@GordonLinoff 예, 이것은 하위 쿼리를 향상시키는 가장 좋은 방법이 될 수 있지만 하위 쿼리를 사용하지 않고이 작업을 수행하는 다른 방법이 있습니까? –
@GordonLinoff 타임 스탬프가 색인 된 raw_metric의 임시 테이블을 만드는 것은 어떻습니까? –