왜 innodb_file_per_table을 사용합니까?


26

에 대한 필요성을 과장하는 많은 기사들이있다 (물론 IMHO) innodb_file_per_table. 나는 innodb_file_per_table개별 테이블에 대해 더 나은 제어가 필요 하다는 것을 이해합니다 . 각 테이블을 개별적으로 백업하십시오. 그러나 더 나은 성능에 대한 주장은 의문의 여지가 있습니다.

내 테스트에서는 60GB의 데이터베이스 성능 innodb_file_per_tableibdata1데이터베이스 성능에 차이가 없습니다 . 물론, 일반적인 쿼리를 사용한 간단한 테스트였으며 실제 상황에서 복잡한 쿼리의 상황이 다를 수 있습니다 (이것이이 질문을 한 이유입니다). 64 비트 리눅스는 ext4대용량 파일을 효과적으로 처리 할 수 ​​있습니다.

를 사용 innodb_file_per_table하면 더 많은 디스크 I / O 작업이 필요합니다. 이 복잡에서 중요 JOINs와 FOREIGN KEY제약.

테이블 스페이스는 단일에서 공유됩니다 ibdata. 어떻게 별도의 테이블 전용 테이블 스페이스가 디스크 공간을 절약 할 수 있습니까? 물론을 사용하여 각 테이블에 대해 테이블 ​​스페이스를 해제하는 것이 더 쉽지만 ALTER여전히 테이블 잠금이있는 비싼 프로세스입니다.

질문 :innodb_file_per_table mysql의 성능 향상에 영향을 줍니까 ? 그렇다면 왜 그렇습니까?


내 질문에 대한이 답변을 참조하십시오 : dba.stackexchange.com/questions/7924/…도 도움이 될 수 있습니다.
KM.

답변:


19

나는 그것이 성능의 문제가 아니라 관리의 문제라고 생각합니다.

테이블 당 별도의 파일을 사용하면 예를 들어 다른 스토리지 장치에 다른 데이터베이스를 저장할 수 있습니다.

큰 파일을 처리 할 수없는 파일 시스템에서 매우 큰 데이터베이스의 경우를 처리 할 수 ​​있습니다 (적어도 한 테이블이 파일 크기 제한에 도달 할 때까지 문제를 연기 함).

제어되지 않은 테이블 스페이스 증가가 없습니다. 삭제할 큰 테이블이 있으면 ibdata파일은 작게 유지됩니다.

성능에 영향을 줄 수있는 한 가지 측면은 테이블 데이터 및 인덱스의 조각화로, 테이블마다 제한됩니다. 그러나 확인을 위해서는 테스트가 필요합니다.


테이블 스페이스 증가가 바로 원하는 이유 innodb_file_per_table입니다.
sjas

13

왜 innodb_file_per_table을 사용합니까?

파일 수준에서 수행 할 수 있으므로 개인을 관리하기가 더 쉽습니다. 즉, 서버가 다운 된 경우에도 테이블 파일을 복사하여 데이터를 복사 할 수 있지만 공유 테이블 스페이스를 사용하면 불필요하게 대규모 일 수있는 모든 것을 복사 하거나 서버가 데이터를 추출하도록 실행할 수있는 방법을 찾는다는 의미입니다 ( 실제로 16 진 편집기로 데이터를 수동으로 추출하고 싶지는 않습니다.

누군가가 단순히 .ibd한 서버에서 다른 서버로 파일을 복사하여 붙여 넣을 수는 없다고 경고 했습니다 . 이것은 사실 일 수 있지만 동일한 서버의 백업에는 적용해서는 안됩니다 ( 전반적으로 사본을 만드는 의미에서 백업 이라는 용어를 사용하고 있습니다. 즉, 전체를 크게 변경하지는 않습니다). 또한 ibdata1시작시 자동으로 다시 작성됩니다 ( 대부분의 "테이블 당 파일로 변환"안내서 의 삭제ibdata1 단계에 표시됨). 따라서 파일 (및 해당 파일 등) 외에 복사 할 필요 가 없습니다 .ibdata1.ibd.frm

잃어버린 테이블을 복구하려는 경우 해당 복사하기에 충분해야 .ibd하고 .frm파일을뿐만 아니라 information_schema(어느 정도 보다 작은 ibdata1). 이렇게하면 더미 서버에 넣고 전체를 복사하지 않고도 테이블을 추출 할 수 있습니다.

그러나 더 나은 성능에 대한 주장은 의문의 여지가 있습니다. … innodb_file_per_table을 사용하면 더 많은 디스크 I / O 작업이 필요합니다. 복잡한 JOIN 및 FOREIGN KEY 제약 조건에서 중요합니다.

당연히 성능은 사용중인 특정 데이터베이스에 전적으로 의존합니다. 한 사람은 다른 사람과는 (대부분의) 다른 결과를 가질 것입니다.

테이블 당 파일로 더 많은 디스크 I / O 작업이 있지만 약간만 더있을 것입니다. 시스템이 어떻게 작동하는지 생각하십시오.

  • 모 놀리 식 데이터베이스의 경우 :

    1. 서버가 시작되었습니다
    2. ibdata1 열렸다
    3. 헤더 및 메타 데이터를 읽습니다.
    4. 구조와 메타 데이터는 메모리에 캐시됩니다
    5. 쿼리가 발생합니다
      1. 서버가 디스크에 액세스하여 이미 열린 데이터를 읽습니다. ibdata1
      2. 서버가 메모리에 데이터를 캐시 할 수 있습니다
  • 테이블 당 데이터베이스의 경우 :

    1. 서버가 시작되었습니다
    2. ibdata1 열렸다
    3. 헤더 및 메타 데이터를 읽습니다.
    4. 각 개별 .ibd파일이 열립니다
    5. .ibd파일 에서 헤더 및 메타 데이터를 읽습니다.
    6. 구조와 메타 데이터는 메모리에 캐시됩니다
    7. 쿼리가 발생합니다
      1. 서버가 디스크에 액세스하여 이미 열린 .ibd파일 에서 데이터를 읽습니다.
      2. 서버가 메모리에 데이터를 캐시 할 수 있습니다

서버가 실행 중일 때 서버에 열린 핸들이 있기 때문에 데이터 파일을 이동할 수 없습니다. 시작될 때 열어서 열어두기 때문입니다. 개별 쿼리마다 열거 나 닫지 않습니다.

따라서 서버가 시작될 때 처음에는 더 많은 I / O 작업 만 있습니다. 실행 중이 아닙니다. 또한 각 개별 .ibd파일에는 고유 한 별도의 오버 헤드 (파일 서명, 구조 등)가 있지만 메모리에 캐시되어 각 쿼리에 대해 다시 읽지 않습니다. 또한 공유 테이블 스페이스를 사용하더라도 동일한 구조를 읽으므로 더 많은 메모리가 필요하지 않습니다.

innodb_file_per_table이 mysql의 성능 향상에 영향을 줍니까?

어떤 경우에는 사실, 성능은 사실 수 있을 악화 .

공유 테이블 스페이스를 사용하는 경우 서버에서 여러 테이블의 데이터 견본을 한 번에 읽을 수 있도록 읽기 및 쓰기 작업을 결합 할 수 있습니다 ibdata.

그러나 데이터가 여러 파일로 분산 된 경우 각 파일에 대해 개별 I / O 작업을 개별적으로 수행해야합니다.

물론 이것은 다시 해당 데이터베이스에 전적으로 의존합니다. 실제 성능 영향은 크기, 쿼리 빈도 및 공유 테이블 스페이스의 내부 조각화에 따라 다릅니다. 어떤 사람들은 큰 차이를 느끼는 반면 다른 사람들은 전혀 영향을받지 않을 수도 있습니다.

테이블 스페이스는 단일 ibdata에서 공유됩니다. 어떻게 별도의 테이블 전용 테이블 스페이스가 디스크 공간을 절약 할 수 있습니까?

그렇지 않습니다. 무엇이든 디스크 사용량 이 증가 합니다.

테스트 할 60GB 데이터베이스는 없지만 WordPress 설치 및 개인용 사용 및 개발 테스트를위한 몇 개의 작은 테이블이 포함 된 "팔레트"개인 데이터베이스는 공유 테이블 스페이스를 사용하는 동안 ~ 30MB로 측정되었습니다. 테이블 당 파일로 변환 한 후 ~ 85MB로 팽창했습니다. 모든 것을 삭제하고 다시 가져와도 여전히 60MB가 넘습니다.

이 증가는 두 가지 요인에 기인합니다.

  • 절대 최소 크기에 대한 ibdata1것입니다 - 몇 가지 이유 - 10메가바이트, 당신은 아무것도하지만 경우에도 information_schema그 안에 저장됩니다.

  • 공유 테이블 스페이스를 사용하면 ibdata1파일 서명, 메타 데이터 등과 같은 오버 헤드 만 발생 하지만 테이블 당 각 개별 .ibd파일에는이 모든 것이 있습니다. 이것은 전체가 (가설이 <10MB 인 경우에도 ibdata1) 적어도 다음과 같이 다소 커질 것임을 의미합니다.

    GetTotalSizeofOverhead() * GetNumTables()

분명히 데이터베이스 크기를 제한하거나 플래시 드라이브에 저장하는 호스트를 사용하지 않는 한 크게 증가하지는 않지만 그럼에도 불구하고 테이블 마다 파일 로 전환하여 증가 합니다. -테이블 당 ibdata110MB로 축소 할 수 있으며 전체 총계는 항상 이상입니다.


11

이것이 항상 innodb_file_per_table을 사용하는 이유입니다.

테이블 당 파일이 없으면 ibdata 파일은 공간을 압축하거나 축소 또는 축소하지 않습니다. 행을 삭제하거나 테이블 또는 데이터베이스를 삭제하면 안됩니다. 큐 시스템이 활성화되어 있으면 2GB의 데이터가 즉시 20GB 파일이 될 수 있습니다.

변경하기 전에 현재 1GB 테이블을 백업 한 다음 삭제하십시오. ibdata에 사용되지 않은 GB 공간이 있습니다. 버머.

임시 측정 값이 단일 데이터 파일을 팽창시키는 인스턴스의 예는 끝이 없지만 아마도 내 의견으로는 innodb_file_per_table을 사용하지 않을 이유가 없다고 말하는 것으로 충분합니다.

또한 읽을 수있는 좋은 게시물이 있습니다 : http://code.openark.org/blog/mysql/reasons-to-use-innodb_file_per_table


1
나는 항상 그것을하는 것이 좋다는 것을 깨달았습니다. SSD가 지원하는 자기 스토리지 어레이는 테이블의 작은 파일에 대해 읽기 / 쓰기 캐시를보다 효과적으로 처리 할 수 ​​있습니다. 시간의 % 99.99가 '읽기'이지만 기록되지 않은 많은 테이블의 경우 항상 스토리지 컨트롤러의 캐시에 있으므로 응답 시간이 크게 줄어 듭니다.
sdkks

5

innodb_file_per_table을 사용하지 않는 이유 는 성능입니다.

mysql 5.5.45 Linux CentOS 릴리스 6.7에서 450 테이블로 데이터베이스에 대한 테스트를 수행했습니다.

대한 단위 테스트 각 테스트하기 전에 데이터베이스에기구를 삽입 (삽입, 갱신, 삭제, 선택)을 (모든 테이블 매번를 사용하지 않음) 또한 자체 테스트 데이터베이스와 많은 작업을 수행하는 성능은 더 나은 3-5x이었다 데이터베이스 테이블이되지 않은 경우 더 많은 파일로 분리되었습니다.

innodb_file_per_table을 사용하기로 결정하기 전에 사용하려는 쿼리로 데이터베이스를 테스트하고 비교하는 것이 좋습니다.

어쩌면 프로덕션 서버의 경우 innodb_file_per_table을 사용할 수 있지만 CI 환경 (통합 계속)에서 단위 테스트를 시작하고 (DB를 많이 사용함) 단위 테스트를 많이 시작하는 개발자는 성능 때문에 사용하지 않는 것이 좋습니다.


2
이것은 450 개의 모든 테이블에 대해 초기 파일을 할당하고 하나의 단일 파일을 할당하는 데 필요한 시간 때문이라고 생각합니다. 프로덕션 환경에서는이 작업이 한 번만 수행되므로 문제가되지 않아야합니다. 그러나 데이터베이스를 빠르게 만든 다음 데이터베이스를 완전히 해제하고 단일 ibdata 파일을 반복해서 반복하는 것이 더 좋습니다.
ColinM

2

사용하지 않는 공간을 되 찾을 수 있기 때문에 데이터를보다 관리하기 쉽게 만듭니다.

데이터베이스가 주로 선택 쿼리에 사용되는 경우 성능에 큰 영향을 미치지 않습니다. 여전히 같은 양의 데이터를 읽어야합니다. 데이터를 읽는 파일이별로 중요하지 않다고 생각합니다.

그러나 많은 삽입 및 업데이트를 수행하는 데이터베이스에서 성능이 저하 될 수 있습니다. mysql은 트랜잭션을 커밋 한 후 스토리지 파일에서 fsync ()를 호출하기 때문입니다. 단일 파일이 있으면 한 번의 호출을 수행하고 호출이 완료되기를 기다립니다. 많은 파일이있는 경우, 여러 번 호출하고 commit 명령이 리턴되기 전에 모든 호출이 리턴 될 때까지 기다려야합니다.

이 문제가 발생한 누군가의 게시물은 다음과 같습니다. http://umangg.blogspot.com/2010/02/innodbfilepertable.html



당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.