현재 mssql의 데이터를 mysql에 넣어 성능 차이를 비교 하려합니다.
MyISAM은 select 쿼리에 약하다고 하고 클러스터 인덱스가 없다고 하기에 InnoDB로 엔진을 선택 하였습니다.
가장 처음 발생한 문제는 1천1백만건에 대한 자료를 mssql에서 mysql로 입력 하여 하는데 100만건 정도 되니까 insert작업이 과도하게 오래 걸리네요.
한 번에 1백개 정도 되는 데이터를 드렌젝션 사용 하여 commit하는데 한번 저장 하는데 약 2~30초 정도 걸리는듯합니다.
InnoDB 에 대한 데이터베이스 옵션은
innodb_data_home_dir="D:/MySQL Datafiles/"
innodb_additional_mem_pool_size=2M
innodb_flush_log_at_trx_commit=0
innodb_log_buffer_size=5M
innodb_buffer_pool_size=256M
innodb_log_file_size=128M
innodb_thread_concurrency=8
위와 같습니다.
또한 테이블 구조를 어떻게 손봐야 할지도 궁금합니다.
일단 mssql의 테이블 구조는 아래와 같습니다.
열 이름 |
형식 |
|
index |
bigint |
기본 키, 자동 증가 |
nodeIndex |
int |
|
dest |
float |
|
source |
float |
|
group |
float |
|
interval |
float |
|
voltage |
float |
|
temperature |
float |
|
humidity |
float |
|
windcourse |
float |
|
regDate |
datetime |
클러스터 인덱스, DESC정렬 |
나머지는 기본값 그대로 사용 하였습니다.
mysql의 테이블 구조는 아래와 같습니다.
열 이름 |
형식 |
|
index |
bigint |
기본 키, 자동 증가 |
nodeIndex |
int |
|
dest |
double |
|
source |
double |
|
group |
double |
|
interval |
double |
|
voltage |
double |
|
temperature |
double |
|
humidity |
double |
|
windcourse |
double |
|
regDate |
datetime |
기본 키 |
InnnoDB는 기본 키로 설정 되어 있으면 클러스터 인덱스로 된다고 하기에 index와 regDate열을 기본키로 넣었습니다.
다행스럽게도 regDate가 40만건 데이터 변환 까지 한번도 중복 되지 않아서 문제가 발생하지 않았지만 regData는 중복을 허용해야합니다.
이렇게 되면 regData는 클러스터 인덱스를 버리고 그냥 키로 설정 해야 하나요? 검색 조건은 nodeIndex와 regData밖에 없습니다.
ex, SELECT * FROM `table` WHERE `regData` >= '2010-01-01 00:00:00' AND `regData` < '2010-01-02 00:00:00' AND `nodeIndex` = 1
mysql의 테이블 생성 쿼리는
CREATE TABLE `table` (
`index` BIGINT(20) NOT NULL AUTO_INCREMENT,
`nodeIndex` INT(11) NOT NULL,
`dest` DOUBLE NOT NULL,
`source` DOUBLE NOT NULL,
`group` DOUBLE NOT NULL,
`interval` DOUBLE NOT NULL,
`voltage` DOUBLE NOT NULL,
`temperature` DOUBLE NOT NULL,
`humidity` DOUBLE NOT NULL,
`windcourse` DOUBLE NOT NULL,
`windspeed` DOUBLE NOT NULL,
`regDate` DATETIME NOT NULL,
PRIMARY KEY (`nodeIndex`, `regDate`) USING BTREE
)
ENGINE=InnoDB
ROW_FORMAT=DEFAULT
이렇게 됩니다. 어떻게 손봐야 위와 같은 조건에 가장 빠르게 동작 하는 테이블 구조를 만들 수 있을지 알고싶습니다.
추가로 40만건에 대한 테스트를 하려고 위와 같은 쿼리를 EXPLAIN을 붙여 날려 봤는데 인덱스를 타지 않더군요. index > 1을 조건에 더 붙어야 타게 되네요.
깊은 지식 없어서 성능 나오는 mssql에 비해 mysql은 겉핥기로 알고 있으면 많은 데이터에 대한 성능은 극악이 되네요.
개선 사항을 알려 주시면 감사합니다. 그럼.. 좋은 하루 되시길 바랍니다! |