2017-05-24 1 views
0

크기가 8.1GB 인 원시 텍스트 파일이 있습니다. 입력 데이터는 매우 정직 : Lab_A (문자열), Lab_B (문자열), 거리 (플로트)MySQL 테이블이 너무 많은 공간을 차지합니까?

내가 LOAD 데이터 INFILE을 사용하여 테이블에 데이터를로드하려고했지만 드라이브가 뛰쳐 공간.

아이디 (INT), Lab_A (VARCHAR), Lab_B (VARCHAR), 거리 (FLOAT) :

대상 테이블은 다음과 같은 형식을 가지고 있었다. Id의 기본 키와 (Lab_A + Distance) 인덱스.

아래 문을 만듭니다

CREATE TABLE 'warwick_word_suite'.'distances' (
    'id' INT NOT NULL AUTO_INCREMENT, 
    'label1' VARCHAR(45) NOT NULL, 
    'label2' VARCHAR(45) NOT NULL, 
    'distance' FLOAT NOT NULL, 
    PRIMARY KEY ('id'), 
    INDEX 'LABEL_INDEX' ('label1' ASC, 'distance' ASC)); 

드라이브는 50 기가 바이트했고 공간이 부족. 시스템을 위해 예약 된 10 기가 바이트를 감안할 때, 나는 테이블이 32GB보다 큰 것을 요구하고 있다고 가정하고있다.

내 질문은 :

  • 어떻게 InnoDB의 테이블이 실제로 차지 않는 많은 상대 입력 데이터의 크기?
  • 수행 색인 테이블은 동일한 인덱싱되지 않은 테이블에 비해 더 많은 공간을 차지?

나는 단지 내 데이터베이스 서버에 대한 더 큰 드라이브를 주문해야할까요?

EDIT : 데이터 돼지를 "ibdata1"로 추적하여/var/lib/mysql에 저장했습니다. 이 파일은 30.3GB를 차지합니다.

+0

이 우리를 보여 '표 [표] CREATE SHOW'문 .. MySQL이 가지고 많은 문자열 데이터 유형은 –

+0

@RaymondNijland 내가 만들 문을 원래의 질문을 업데이트했다. – Tomas2015

+0

실제로 그 공간을 모두 사용했는지 확인 했습니까? 그 공간을 모두 차지하는 파일을 본 적이 있습니까? 어떤 로그를 활성화 했습니까? 이진 로그? 일반 로그? 느린 로그? – fancyPants

답변

0

번 문제.

InnoDB는 원시 데이터가 걸리는 배 - 배 걸립니다. 이것은 근사한 근사치입니다. 많은 요소가 있습니다.

ibdata1

테이블을 넣어 기본 곳입니다. 테이블을 거기에 두려고하면 그 파일은 축소되지 않습니다. 이것은 문제가 될 수 있습니다. innodb_file_per_table = ON 전에로드하는 것이 더 좋았을 것입니다. 그런 다음 테이블은 별도의 .ibd 파일에 저장되고 실패하면 해당 파일이 사라집니다. 그대로 유지하면 디스크 공간을 많이 차지하지 않으므로 복구 할 수 없습니다. (복구, 다른 모든 InnoDB 테이블 덤핑 mysqld를 중지,을 ibdata1을 제거, 다시 시작한 다음 다른 테이블을 다시로드가 포함되어 있습니다. 위로 궁극적 인 문제에

... 데이터를 사용하는 방법. 첫째, 우리가 볼 수있는 테이블의 몇 행 (또는 파일의 행)

이것은 InnoDB 대신 MyISAM에로드하는 경우 일 수 있으며 크기 그 테이블은 8.1GB에 더 가깝고 두 개의 인덱스가 추가되어 5-10GB가 추가 될 수 있습니다. 여전히 불쾌감을 느낍니다.

실험실 이름을 정규화하면 큰 효과를 볼 수 있습니다. 10K 실험실과 100M 거리 (모든 실험실마다 모든 실험실)가 있습니다. 그것들 중 절반은 여분입니까? 실험실 이름을 정규화하면 행당 50 비트를 절약 할 수 있습니다.

또는 당신은 더 많은 디스크 공간을 얻을 수 있습니다.

숙고하는 제안 (들) 위의 태클 할의; 당신이 아직도 도움이 필요한 것을 우리에게 알려주십시오.

+0

는 의견에 감사드립니다. 그건 의미가 있습니다. 나는 레이블이 이미 정규화 실현, 그래서 원시 데이터의 예는 다음과 같습니다 궁극적 인 목표이다 '1.039324 0 1 1.039324 1 0 1.055924 0 2 1.055924 2 0 1.048772 0 3 1.048772 3 0 ' 대상 레이블을 제공하고 가장 가까운 레이블을 검색합니다 (최단 거리). 보시다시피 위의 데이터는 중복되었습니다 (거리 0 & 1 및 1 & 0은 동일 함). 나는 색인 검색이 그렇게 빨리 될 것이라고 생각 했었습니다. 사실입니까? 이것은 Label1과 Label2에서 대상을 검색하는 것과는 대조적으로 한 열만 검색하면됩니다. 또한 MyISAM이 더 빠를까요? – Tomas2015

+0

'SPATIAL' 색인이 보이지 않습니다. 그런가? 어떤 MySQL 버전을 실행하고 있습니까? 모든 거리를 사전 계산 해본 적이 없습니까? "raw data"= "1.039324 0 ..."이 무슨 뜻입니까? 미안하지만, 나는 길을 잃고있는 것처럼 보입니다. –

+0

버전은 5.5.55-0 + deb8u1입니다. SPATIAL은 아마도 거리가 미리 계산되어 있기 때문에 이해가되지 않을 것입니다. 맞습니까? 표는 20K x 20K 행렬의 표현입니다. 그래서 두 개의 열은 레이블이고 한 열은 그들의 거리입니다. 이것은 약 200M 행을 의미합니다 (일부 레이블 쌍에는 거리가 없음). MySQL을 잘 모르는 상태에서 가장 좋은 솔루션이 무엇인지 궁금합니다. 결과적으로 거리별로 정렬 된 "SELECT WHERE"쿼리의 속도가 궁극적으로 중요합니다. 초기 LOAD 외에 데이터를 전혀 삽입하지 않을 것입니다. MyISAM이 많은 행을 가진 테이블에서 SELECT WHERE 속도에 더 적합할까요? – Tomas2015

관련 문제