2012-11-14 9 views
2

데이터 마이닝을 위해 배치 데이터에서 테이블을 만들고 싶습니다. 하루에 약 2 천 5 백만 행의 데이터가이 테이블에 저장됩니다. 테이블에 여러 개의 인덱스가 정의되어 있으므로 삽입 (일괄 삽입) 속도가 매우 느립니다. 인덱스가 없으면 40K 행을 고수 할 수 있습니다. 인덱스를 사용하면 3-4K와 비슷하므로이 모든 것을 실행할 수 없게 만듭니다. 따라서 아이디어는 하루에 데이터를 분할하고 키를 비활성화 한 다음 그 날의 삽입을 수행하고 인덱스를 다시 활성화하는 것입니다. 하루 정도의 데이터에서 인덱스를 다시 연결하면 20 분이 걸립니다. 이것은 나의 질문에 나를 데려 간다. 인덱스를 다시 활성화하면 모든 부분의 인덱스를 다시 계산해야합니까, 아니면 해당 날짜에만 다시 계산해야합니까? 파티션이 켜져있는 인덱스 (이 경우 날짜)는 해당 날짜에만 있어야합니다. 하지만 다른 지표들은 어때? 모든 파티션의 인덱스를 다시 계산해야하는 경우 합리적인 시간 내에 완료 할 수 없습니다. 아는 사람 있나요? 표시가 생성Mysql 파티션 인덱싱

은 다음과 같이이다 :

sts | CREATE TABLE `sts` (
`userid` int(10) unsigned DEFAULT NULL, 
`urlid` int(10) unsigned DEFAULT NULL, 
`geoid` mediumint(8) unsigned DEFAULT NULL, 
`cid` mediumint(8) unsigned DEFAULT NULL, 
`m` smallint(5) unsigned DEFAULT NULL, 
`t` smallint(5) unsigned DEFAULT NULL, 
`d` tinyint(3) unsigned DEFAULT NULL, 
`requested` int(10) unsigned DEFAULT NULL, 
`rate` tinyint(4) DEFAULT NULL, 
`mode` varchar(12) DEFAULT NULL, 
`session` smallint(5) unsigned DEFAULT NULL, 
`sins` smallint(5) unsigned DEFAULT NULL, 
`tos` mediumint(8) unsigned DEFAULT NULL, 
PRIMARY KEY (userid, urlid, requested), 
KEY `id_index` (`m`), 
KEY `id_index2` (`t`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 

그것은 현재 분할되지 않습니다.

+0

현재 테이블 구조는 무엇입니까? ('SHOW CREATE TABLE your_table'의 출력) – Jocelyn

+0

편집했습니다 ... – delmet

답변

0

테이블에서 인덱스를 사용/사용하지 않도록 설정합니다. 즉, 인덱스가 테이블의 모든 부분에서 비활성화/활성화됩니다.

새로운 데이터를로드하기 위해이 같은 시나리오를 생각해보십시오 :

  1. 는 모든 파티션을 정의하는 스테이징 테이블을 작성하면 인덱스없이 준비 테이블에
  2. 데이터로드가 필요합니다.
  3. 이 테이블에 인덱스를 만듭니다.
  4. 테이블을 스테이징 테이블과 동일한 파티션으로 이동합니다. 준비 테이블

  • 드롭 인덱스는 새로운 분할 된 테이블에 데이터를 이동하는 같은 논리를 사용하여 제어 방식으로 기존 데이터를 분할합니다.