2013-03-12 1 views
0

현재 하나의 테이블이 있으며 매우 빠르게 채워집니다. 50 개의 장치가 있습니다. 30 초마다 각 장치에서 데이터를 수집합니다. 따라서 10,000 개의 장치를 추가하면 매월 876,000,000 개의 레코드가 생성됩니다. 여기 데이터베이스 디자인 - 구조화 방법

INSERT INTO unit_data 
(`id`,`dt`,`id_unit`,`data1`,`data2`, 
`ip`,`unique_id`,`loc_age`,`reason_code`, 
`data3`,`data4`,`Odo`,`event_time_gmt_unix`, 
`switches`,`on_off`,`data5`) 

내가 꽤 복잡한 쿼리와 보고서를 직면하고

PRIMARY KEY (`id`), 
    UNIQUE KEY `id_unit_data_UNIQUE` `id`), 
    KEY `fk_gp2` (`id_unit`), 
    KEY `unit_dt_id` (`dt`,`id_unit`), 
    KEY `unit_id_dt` (`id_unit`,`dt`), 
    CONSTRAINT `fk_gp2` FOREIGN KEY (`id_unit`) REFERENCES `unit` (`id_unit`) ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=InnoDB AUTO_INCREMENT=1049392 DEFAULT CHARSET=utf8$$ 

내 관계, 그리고 내가 그들을 수행 할 때, 우리의 시스템이 응답 및 실행 시간 제한을 타격하지 않습니다. (이것은 2mil + 레코드입니다)

데이터베이스 구조를 다시 생각하고 다시 구현해야합니다. 그리고 현재 나도

  • 매달

당신은 무엇을 제안하기위한 각 단위에 대한 새 테이블을 만들고 각 단위에 대한 새 테이블을 만들기에 대해 생각하고?

+0

단위 = 기기 맞지? 필자는 각 장치에 대해 별도의 테이블을 만들 것을 제안하지 않습니다. 귀하의 색인은 귀하가 실행해야하는 쿼리를 처리합니까? – Melanie

+0

장기 실행 쿼리는 어떻게 생깁니 까? –

+0

Darius, 현재 쿼리를 수정하려고합니다. http://stackoverflow.com/questions/15367719 – Andrew

답변

0

새 테이블을 만드는 것이 좋은 생각이지만, 구현할 필요가 없습니다. MySql에 이미 키워드 "mysql + partitioning"과 같은 도구 - 구글이 있습니다. 쿼리를 변경하지 않아도되기 때문에 MySQL을 사용하는 것이 좋습니다. create table statment에 "partition by"키워드를 추가하기 만하면됩니다.

또 하나의 트릭입니다. 큰 테이블에 많은 정보를 수집하고 거기에서 일부 데이터를 선택하는 것이 좋습니다. 그러나 많은 새로운 행을 삽입하면 테이블이 잠기고 (선택에 사용할 수 없음) 인덱스를 다시 작성하게됩니다 (테이블이 인덱싱되었음을 확신합니다). 내 현재 프로젝트에서 나는 다음과 같이 당신과 비슷한 것을하고있다 :

1) 큰 테이블의 테이블 복제본을 만든다. 하나의 차이점이있는 BIG-TABLE과 동일한 구조를 가져야합니다. 테이블 복제에는 색인이 없습니다.

2) 장치의 데이터를 수신하면 테이블 복제본에 넣습니다.

3) 큰 테이블에 작은 테이블의 레코드를 매 시간마다 또는 매일로드하는 일부 로봇 에이전트를 작성하십시오. 이는 사용자에 따라 다르지만 가장 좋은 경우는 테이블의 크기가 fullscan을 수행 할 수있을 정도로 작을 것입니다. (색인이 생성되지 않음을 기억하십시오).

4) SELECT 쿼리를 수행하려는 경우 인덱싱 된 BIG 테이블에서 2 개의 테이블로 데이터를 입력하십시오. 아무도 데이터를 삽입하지 않으므로 (로봇 만 수행 할 수 있음) 작은 테이블에서 fullscan - 당신이 그것을 작게 유지할 수 있기 때문에 또한 충분히 빠르다.

5) 로봇은 평온한 시간에 깨어 야합니다. c- 밤에있을 수 있습니다.

+0

나는이 최신 테이블이보고를 위해 사용되는 동안 최신 레코드를 보여주는 테이블을 이미 가지고 있습니다. 그래서 내 보고서를 실행할 때 내 서버가 CPU에서 100 %의 피해를 입는다. 모든 클라이언트가 30 초 동안 고통 받고있다. – Andrew

+0

작은 테이블에서 큰 테이블로 최신 레코드를 삽입하는 것이보고 시간과 일치합니까? 이 사건이 유일한 나쁜 경우 인 것 같습니다. 대형 테이블의 복사본을 2 개 보관해야 할 수도 있습니다 - BT1, BT2; 최근 기록을 각 "some_interval"시간마다 BT1에 쓰고, 이전 BT2를 삭제하고 BT1의 새 사본으로 교체하십시오. BT2에 대한 보고서를 실행하십시오. 이러한 구조는 보고서 (선택)/채우기 (삽입) 쿼리가 교차하지 않도록합니다. – Baurzhan

관련 문제