2016-08-08 5 views
1

예를 들어 forstream을 사용하여 일반 이진 파일에 쓰는 것과 같은 속도로 MYSQL DB 테이블에 쓰기를 원합니다.일반 파일에 쓰는 것처럼 MYSQL DB에 어떻게 쓸 수 있습니까?

일반적으로 ofstream을 사용하여 파일에 100M 바이트를 쓰는 데 1 초도 걸리지 않습니다.

MYSQL에서 9 초 이상이 100M 바이트를 삽입했습니다. MYISAM 테이블과 여러 행 삽입 문을 사용했습니다. 즉

, 나는 그것이 그래서

바이너리 파일 인 것처럼 단지 표를 작성, (등 ... 구문 분석, 검사)가 더하지 않습니다 있도록 MySQL의를 구성 할 수 있나요 어떤 방법으로 그것을 달성 할 수 있습니까?

편집 1 : 삽입 위치를 MAX에 사용되는 코드 스 니펫 여기

됩니다 : 여기

내가 채울하려는 테이블,

create table Frames 
(
f1 varchar(8) not null , 
f2 varchar(6) not null , 
f3 varchar(6) not null , 
f4 varchar(2) not null , 
f5 varchar(4), 
f6 varchar(16000), 
f7 varchar(4) not null 
); 

편집 2 는 10000으로 정의된다.

for (int c = 0; c < 100; ++c) 
{ 
    string query("insert into Frames (f1,f2,f3,f4,f5,f6,f7) values"); 
    for (int i = 1; i <= MAX; ++i) 
    { 
    query += "('AAAAAAAA','000001','000002','05','5005','000000000100000000010000000001000000000100','MKJE')"; 
    query += (i==MAX) ? ";" : "," ; 
    } 
    if (mysql_query(conn, query.c_str())) { 
    fprintf(stderr, "%s\n", mysql_error(conn)); 
    return(1); 
    } 
} 

감사

+1

인덱스가 있으면 삽입하기 전에 삭제하고 작업이 완료되면 다시 작성하십시오. 인덱스는 삽입, 업데이트, 삭제 작업에 영향을줍니다. – jonju

+0

테이블 설명을 붙여 넣으십시오. – rocks

+0

@jonju : 사실, 테이블에 인덱스가 없지만 여전히 서술이 매우 느립니다 ... –

답변

1

speed of INSERT을 향상시키는 데 다양한 트릭을 사용할 수 있습니다. 이 링크는 많은 도움말을 담고있는 MySQL 매뉴얼이다.

그러나 파일에 직접 쓰는 속도에 가깝지는 않을 것입니다. MySQL은 무대 뒤에서 많은 추가 작업을 수행하고 SQL을 파싱하고 액세스 권한을 적용하고 데이터 제약 조건을 적용하고 데이터를 압축 된 데이터 형식으로 변환 한 다음 효율적으로 파일에 데이터를 구성하고 인덱스를 업데이트합니다.

저장소 엔진으로 InnoDB (기본값)를 사용하는 경우 업데이트 할 기본 키 인덱스가 항상 있어야합니다. InnoDB는 테이블 데이터를 클러스터 된 인덱스로 저장한다.

파일에 추가하는 것처럼 진정한 속도를 얻을 수있는 유일한 방법은 CSV storage engine을 해당 파일에 직접 추가하는 것입니다. 즉, SQL을 전혀 사용하지 말고 데이터 파일에 쓰십시오. 파일이 올바른 위치에 있고 올바른 이름을 가지고 있다면, MySQL 테이블의 데이터가됩니다.

+0

CSV 스토리지 엔진은 제 경우에 매우 좋은 아이디어이지만, 어떻게 작성합니까? .frm과 .csm 파일 .. –

+0

평소처럼'CREATE TABLE'을 사용하고 마지막에'ENGINE = CSV'를 지정하십시오. 이렇게하면 .csv 데이터 파일과 메타 데이터 파일이 모두 만들어집니다. 그런 다음 데이터 파일에 직접 쓸 수 있습니다. CSV 엔진에도 단점이 있습니다. 인덱스, 트랜잭션 없음, 자동 증가 PK 없음, 분할 없음, NULL 가능 컬럼 없음. –

+0

이것은 완벽한 솔루션입니다. 감사합니다. –

0

당신을 위해 좋은 성능 찾을 때까지 당신은 다음 단계를 시도해야 :

  1. 이 MySQL의 인스턴스를 가정 NoSQL에
  2. 을 시도 LOAD DATA INFILE
  3. 시도가 제대로 당신이 조정된다 데이터베이스 서버 및 네트워크 인프라 스트럭처를 수직적으로 확장하는 것 외에 다른 선택이 없음

인덱스 나 ACID 같은 mysql 기능이 필요하지 않은 이유는 파일에 쓰지 않는 이유이다. 파일에 쓰는 것과 같은 성능을 얻지 못할 것이므로

+0

실제로, LOAD DATA INFILE을 시도했지만 일반 파일 –

+0

@ johnsamir을 작성하는 것보다 나쁜 성능을 얻었습니다. 2 단계를 계속 진행하십시오 ... – giammin