database.sarang.net
UserID
Passwd
Database
DBMS
ㆍMySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MySQL Q&A 29684 게시물 읽기
No. 29684
테이블 구조와 innodb 튜닝 질문입니다.
작성자
iruis
작성일
2010-06-02 11:41ⓒ
2010-06-02 11:46ⓜ
조회수
8,142

현재 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은 겉핥기로 알고 있으면 많은 데이터에 대한 성능은 극악이 되네요.
개선 사항을 알려 주시면 감사합니다. 그럼.. 좋은 하루 되시길 바랍니다!

이 글에 대한 댓글이 총 1건 있습니다.

몇 가지 적어봅니다.

 

1. MyISAM

트랜잭션 및 멀티-버저닝을 지원하지 않고, 테이블-레벨-락을 사용하기 때문에 흔히 단점으로 꼽힙니다.

단, 테이블의 마지막에 INSERT 하는 경우에 대해서는 SELECT 구문에 관계 없이 INSERT를 수행할 수 있고, OLAP적인 처리에 있어서는 InnoDB보다 성능이 낫게 나오는 경우도 있습니다. 제 블로그의 자료를 링크합니다. http://blog.naver.com/ez_/140103738166

 

2. 대용량 인서트

보통은 LOAD DATA를 통해서 하지만, 다른 방법으로 INSERT하는 경우에, 인덱스 생성을 잠시 중단시켜주는 것이 효율적입니다. ALTER TABLE [tablename] DISABLE KEYS / ENABLE KEYS를 통해 설정할 수 있습니다. 참고로, LOAD DATA는 내부적으로 위의 작업을 수행하는 것으로 알고 있습니다.

 

나머지 사항은 실제 사용하는 쿼리문과 EXPLAIN 결과를 같이 올려주셔야 확인해볼 수 있을 것 같습니다.

박현우(lqez)님이 2010-06-03 05:42에 작성한 댓글입니다.
이 댓글은 2010-06-03 05:49에 마지막으로 수정되었습니다.
[Top]
No.
제목
작성자
작성일
조회
29687다중검색하는거 질문올립니다. [2]
윤은숙
2010-06-03
7259
29686질문 드립니다. [1]
권기혁
2010-06-03
6588
29685쿼리 질문이요~ [1]
조중연
2010-06-02
6577
29684테이블 구조와 innodb 튜닝 질문입니다. [1]
iruis
2010-06-02
8142
29683함수로 테이블을 리턴하는게 가능한가요? [2]
VQ
2010-06-02
6758
29682mysql 바이너리 설치시 이런상황 어떻게 받아 들어야 하나요? [1]
우째~
2010-06-01
8158
29681Windows XP Home edition 에 MySQL 콘솔 설치 [1]
투다리
2010-06-01
7349
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.056초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다