2010-05-25 6 views
1

테스트 테이블이 있습니다. 테스트 테이블은 다음과 같습니다 :MySQL + MyISAM 테이블 크기 질문

CREATE TABLE `mytest` (
    `num1` int(10) unsigned NOT NULL, 
    KEY `key1` (`num1`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

이 테이블에 5 천만 개의 행이 삽입되었습니다.

테이블 상태를 표시 할 때 avg_row_length는 7입니다. mySQL에서 정수로 4 바이트를 사용했기 때문에 4가 표시 될 것으로 예상했습니다. 키가 avg_row_length에 영향을 줍니까? 내 .MYD 파일을 볼 때 크기는 334MB이며 avg_row_length가 7이라는 점을 정확히 알고 있어야합니다. 그러나 실제로는 int가 있다고 가정하면 실제로 190MB가 표시됩니다.

+----------------+--------+---------+------------+----------+----------------+-------------+------------------+--------------+-----------+----------------+---------------------+---------------------+------------+-------------------+----------+----------------+---------+ 
| Name   | Engine | Version | Row_format | Rows  | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time   | Update_time   | Check_time | Collation   | Checksum | Create_options | Comment | 
+----------------+--------+---------+------------+----------+----------------+-------------+------------------+--------------+-----------+----------------+---------------------+---------------------+------------+-------------------+----------+----------------+---------+ 
| mytest   | MyISAM |  10 | Fixed  | 50000000 |    7 | 350000000 | 1970324836974591 | 600518656 |   0 |   NULL | 2010-05-22 09:15:06 | 2010-05-22 19:32:53 | NULL  | latin1_swedish_ci |  NULL |    |   | 

mytest 테이블의 표시 테이블 상태 출력을 포함 시켰습니다. 형식에 대해 죄송합니다 : D 미리 감사드립니다!

알레산드로 Ferrucci는

+0

이 3byte 오버 헤드가 다른 크기에서 일관되게 유지됩니까? 열쇠가 없다면 어떻게 될까요? 내가 찾은 최선책은 다음과 같습니다 : http://forge.mysql.com/wiki/MySQL_Internals_MyISAM 필자는 "컬럼에 3byte의 오버 헤드가 항상 있습니다."와 같은 것을 발견하지 못했습니다. – Mike

+0

이것은 특이합니다. MyISAM은 일반적으로 NULL 가능 컬럼 또는 문자열을 포함하는 테이블에 대한 헤더 만 추가합니다. 헤더는 총 행 길이를 나타내며 각 NULL 가능 컬럼에 대한 비트 플래그를 포함합니다. 여기도 적용되지 않습니다. 그래서 놀랍습니다. 두 번째 "int not null"열을 추가하면 avg-row-length가 9 바이트로 변경됩니다. 1 바이트 오버 헤드. – Martin

+0

답변은 다음 페이지에 있습니다 - 레코드 헤더를 설명하는 섹션 : http://forge.mysql.com/wiki/MySQL_Internals_MyISAM#MyISAM_Record_Structure 레코드가 삭제되었는지 여부를 나타내는 플래그가 있습니다. 이렇게하면 NULLable 열이없는 테이블의 단일 바이트 레코드 헤더가 설명되지만 3 바이트 헤더는 설명되지 않습니다. – Martin

답변

2

나는 문제가 MySQL은 기본적으로 사용하는 포인터의 크기라고 생각합니다.

MySQL reference에서 인용 :

AVG_ROW_LENGTH

테이블의 평균 행 길이의 근사치. 가변 크기 행이있는 대형 테이블에만이 값을 설정해야합니다.

MyISAM 테이블을 만들 때 MySQL은 MAX_ROWS 및 AVG_ROW_LENGTH 옵션의 제품을 사용하여 결과 테이블의 크기를 결정합니다. 어느 쪽의 옵션도 지정하지 않으면 MyISAM 데이터 및 인덱스 파일의 최대 크기는 기본적으로 256TB입니다. (운영 체제가 큰 파일을 지원하지 않으면 표 크기가 파일 크기 제한에 의해 제한됩니다.) 포인터를 작게 유지하여 색인을 작고 빠르게 만들고 큰 파일이 실제로 필요하지 않으면 myisam_data_pointer_size 시스템 변수를 설정하여 기본 포인터 크기를 줄일 수 있습니다. (5.1.4 절. "서버 시스템 변수"를 참조하십시오.) 모든 테이블을 기본 한계 이상으로 성장시키고 테이블을 약간 느리거나 필요 이상으로 만들려는 경우 기본 포인터 크기를 늘릴 수 있습니다 이 변수를 설정하십시오. 값을 7로 설정하면 테이블 크기가 65,536TB까지 허용됩니다. 그 도움이 경우

시도는, 테이블 작성 또는 ALTER TABLEMAX_ROWSAVG_ROW_LENGTH 자신을 설정하고 확인합니다.

+0

흥미 롭습니다.AVG_ROW_LENGTH를 설정하려했는데, 그게 실제로 내가 수축하려고했던 것이기 때문입니다. 정말 짧은 시간이 걸렸고 아무 것도하지 않았습니다 (AVG_ROW_LENGTH는 여전히 7입니다). 다음 문을 사용하여 두 변수를 설정합니다. alter table mytest MAX_ROWS = 50000000 AVG_ROW_LENGTH = 4; 그리고 이제 AVG_ROW_LENGTH는 5 (바이트라고 가정합니다)입니다. MyISAM이 바이트 공백을 위해 여분의 바이트를 사용하고 있는지 확실하지 않습니다. 하지만 왜 이미 짝수 바이트 크기를 채워야합니까? –

+0

추가하는 것을 잊었습니다. 이제 전체 .MYD 크기는 239MB이며 5 * 500,000,000으로 계산되지 않습니다. 누구든지 테이블을 변경하고 최대 행 길이와 avg_row_size를 변경하면 myISAM이 데이터를 저장하는 방식으로 공간 절약 최적화를 수행 할 수 있습니다. –

+0

@alessandro ferrucci : 확실하지는 않습니다 만,'AVG_ROW_LENGTH'와'MAX_ROWS'는 단지 추천할만한 값이라고 생각합니다. 아마 AVG_ROW_SIZE는 현재 데이터 크기와 row_count를 기반으로 계산됩니다. 그러나 MySQL이 현재 행 수만큼 공간을 예약하지 않는다고 생각합니다. 따라서 차이점을 얻을 수 있습니다. 그러나 이것은 내 자신의 추측이다. – newtover

관련 문제