2012-04-22 4 views
0

일부 데이터를 저장하기 위해 mysql 서버를 설정하는 중이지만 이번 주말에 약간의 정보를 읽은 후에 데이터를 업로드하는 데 문제가있을 수 있습니다.여러 서버를 사용하여 mysql의 데이터 업로드 성능을 향상시킬 수 있습니까?

기본적으로 매일 여러 데이터를 생성 한 다음 공유 대기열로 보내 프로세스/분석합니다. 데이터는 약 50 억 행 (매우 작은 데이터, 열의 ID 번호 및 다른 열에있는 int의 사전 임에도 불구하고)입니다. 필자가 보았던 대부분의 성능 보고서에는 인서트 속도가 60에서 100k/초로 10 시간 이상 걸리는 것으로 나타났습니다. 우리는 데이터를 매우 빨리 처리 할 필요가 있으므로 그 날에 작업을 수행 한 다음 폐기 할 수도 있습니다 (또는 S3 또는 그 밖의 테이블로 테이블을 얻을 수도 있습니다).

어떻게해야합니까? 내가 사용할 수있는 8 대의 서버가 (데이터베이스 서버 이외에) 어떻게 든 업로드를 빠르게하기 위해 사용할 수 있습니까? 처음에는 데이터를 서버에 동시에 밀어 넣을 생각 이었지만 각 데이터에 데이터를로드 한 다음 분리 된 모든 데이터를 하나의 서버로 병합하려고 시도 할 수도 있습니다.

innodb와 mysql을 사용하려고했는데 (다른 모든 설정을 사용할 수는 있지만) mysql이 작동하지 않는 경우에는 최종적으로 그렇게하지 않을 것입니다. (전에 hbase를 사용했지만, mysql 솔루션을 처음으로 문제가 더 널리 사용되는 것보다 쉽게 ​​도움을 얻을)?

답변

1

와우. 그것은 많은 데이터를로드하는 것입니다. 이 권리를 얻으려면 꽤 많은 디자인 아이디어가 필요할 것 같습니다.

다중 mySQL 서버 인스턴스는 로딩 속도에 도움이되지 않습니다. 차이점은 무엇보다 빠른 프로세서 칩과 매우 빠른 디스크 입출력 서브 시스템이 mySQL 서버에 있다는 것입니다. 64 비트 프로세서를 사용하고 많은 RAM을 프로비저닝 할 수 있다면 큰 테이블에 대해 MEMORY 액세스 방법을 사용할 수 있습니다. 실제로는 매우 빠릅니다. (그러나 이것이 도움이된다면 거대한 Java HashMap이 더 잘 작동 할 것입니다.)

질문 : 왜 SQL 쿼리 가능 테이블에이 정보를 숨겨야합니까? 데이터를로드 한 후 데이터를 어떻게 사용합니까? 단일 행 또는 수십억 개의 행을 검색하는 많은 쿼리를 실행합니까? 또는 테이블의 큰 부분을 갈아 치우는 집계 쿼리 (예 : SUM(something) ... GROUP BY something_else)를 실행 하시겠습니까?

불완전하게로드되는 동안 데이터에 액세스해야합니까? 또는 첫 번째 액세스 전에 전체 데이터 배치를로드 할 수 있습니까?

모두 쿼리가 전체 테이블을 그라인딩해야하는 경우 인덱스를 사용하지 마십시오. 그렇지 않으면. 그러나 필요하지 않은 색인을 던지지 마십시오. 그들은 당신에게 부하 성능, 큰 시간을 소비하게 될 것입니다.

이 테이블에는 InnoDB 대신 myISAM을 사용하는 것이 좋습니다. myISAM의 트랜잭션 의미론이 부족하여로드하는 것이 더 빠릅니다. myISAM은 집계 쿼리 나 소수 행 쿼리를 처리 할 때 잘 수행 할 것입니다.

매일 데이터에 대해 별도의 테이블을 갖고 싶으므로 테이블의 이름을 바꾸거나 단순히 새 테이블에 액세스하여 어제의 데이터를 "제거"할 수 있습니다.

LOAD DATA INFILE 명령 사용을 고려해야합니다.

http://dev.mysql.com/doc/refman/5.1/en/load-data.html

이 명령은 MySQL 서버의 파일 시스템과에서 파일을 읽을 수있는 MySQL 서버를 유발하는 테이블에 직접 대량-로드합니다.다른 컴퓨터의 클라이언트 프로그램에서 INSERT 명령을 수행하는 것보다 빠릅니다. 하지만 프로덕션 환경에서 설정하는 것은 또한 까다로운 일입니다. 공유 큐는로드 할 데이터 파일을 작성하기 위해 mySQL 서버의 파일 시스템에 액세스해야합니다.

부분적으로로드 된 테이블을 쿼리 할 필요가없는 경우에만 인덱싱을 사용하지 않도록 설정 한 다음 전체 테이블을로드하고 인덱싱을 다시 사용하도록 설정해야합니다.

관련 문제