2015-01-20 2 views
3

나는 라스베리 파이 (laspberry Pi)를 사용하여 1-Wire 센서로 수집 된 가정용 온도 데이터를 기록했습니다. 데이터는 수년 동안 모두 MySQL 데이터베이스로 수집되었습니다. 나는 Raspbian 배포본과 기본 MySQL 설정을 사용한다. 이제 백만 건이 넘는 테이블이 있고 Pi는 쿼리를 매우 느리게 실행합니다.저 사양 시스템의 lrge 테이블에서 MySQL 성능을 향상 시키려면 어떻게해야합니까?

+--------------+----------+------+-----+---------------------+-------+ 
| Field  | Type  | Null | Key | Default    | Extra | 
+--------------+----------+------+-----+---------------------+-------+ 
| timeRecorded | datetime | NO | PRI | 0000-00-00 00:00:00 |  | 
| sensorName | char(3) | NO | PRI |      |  | 
| tempValue | float | YES |  | NULL    |  | 
+--------------+----------+------+-----+---------------------+-------+ 

I는 온도에 대한 날짜 및 시간, 3 문자 이름 및 센서 값을 기록한다 : 여기

는 TemperatureRecords 테이블에 대한 설명이다. 특정 센서의 현재 (최근) 온도를 선택하는 쿼리와 그날 가장 높은 온도를 선택하는 쿼리의 두 가지 쿼리를 실행하고 싶습니다.

현재 온도 예 :

SELECT ROUND(tempValue, 1) as tempValue 
FROM TemperatureRecords 
WHERE DATE(timeRecorded) = '2015-01-20' AND HOUR(timeRecorded) = '20' AND sensorName = 'abc' 
ORDER BY timeRecorded DESC LIMIT 1; 

최고 온도 예 :

SELECT MAX(tempValue) 
FROM TemperatureRecords 
WHERE DATE(timeRecorded) = '2015-01-20' AND sensorName = 'abc'; 

불행하게도이 난에서 데이터를 검색 할 특히, 너무 느린이다, 완료 10-20 초 정도 걸릴 수 있습니다 한 번에 웹 페이지에 여러 센서를 표시 할 수 있습니다.

나는 테이블에 추가 인덱스를 추가하려고 시도했지만 개선되지 않았으므로 어쨌든 인덱스를 완전히 이해할 수 있는지 확신 할 수 없습니다. /usr/share/doc/mysql-server-5.5/examples/my-small.cnf에있는 작은 시스템에서 MySQL 구성을 사용해 보았습니다. 성능은 향상되지만 좋지는 않습니다.

MySQL에 대한 지식이 어느 정도 기본입니다. 지금 내 데이터가 너무 커지거나 내 설정을 향상시키기 위해 할 수있는 일이 있습니까?

+0

예. RANGE 쿼리를 사용해보십시오 – Strawberry

답변

1

DATE()과 같은 전화 걸기 방법으로 문제가 발생합니다. 이것들은 색인을 생성 할 수 없으며 당신이 물 속에서 죽었다는 색인이 없습니다.

자주 호출하는 경우 검색중인 데이터가 정확하게 포함 된 DATE 열을 만듭니다. 또한 추출 할 시간 정보를 캡처하는 열이 필요할 수도 있습니다.

데이터베이스 정규화 원칙은 이상적인 형식이 허용 할 수 없을 정도로 느린 상황에 도달 할 때까지 적용됩니다. 이 경우 해당 문제를 해결하기 위해 신중하게 비정규 화해야합니다. 이와 같이 데이터를 동기화하는 것은 까다로울 수 있으므로 마스터 날짜가 변경 될 때마다 이러한 파생 된 열을 모두 최신 상태로 유지하십시오.

당신은있는 그대로 당신은 같은 시간의 범위를 좁힐 수 있다면 DATETIME를 사용하는 여기있는 기회를 가질 수있다 : 그 작동하는 경우

WHERE timeRecorded BETWEEN '2015-01-20 20:00:00' AND '2015-01-20 20:59:99' 

, 기존 인덱스가 적용됩니다.

3

범인은 WHERE DATE(timeRecorded) = '2015-01-20'입니다. 일치하는 지 여부에 관계없이 모든 행에 대해 DATE()을 계산하고 색인 사용을 허용하지 않습니다.

시도 : WHERE timeRecorded >= '2015-01-20 00:00:00' and timeRecorded < '2015-01-21 00:00:00'

세부 사항에 대한 this SO question하세요!

+0

@Strawberry 잘 했어, 고마워! –

1

나는 당신이 라스베리 파이 (Raspberry Pi)에서 성취 할 수 있다고 생각합니다. 무거운 프로세싱 쿼리가 처리되는 방식을 변경하면됩니다.

과거 데이터 인 경우 데이터를 매일 처리하여 웹 페이지에서 빠르게 참조 할 수있는 다른 (더 작고 빠른) 테이블에 저장하십시오.

시간별 평균은 매시간 만 실행되며 별도의 테이블에 저장됩니다.

현재 온도는 버퍼 테이블과 레코드에 있지만 웹 페이지는 버퍼 테이블에 액세스해야합니다.

정확하지는 않지만 차이는 작지만 큰 속도 증가가 표시되어야합니다.

관련 문제