2017-12-22 40 views
1

학습/실험 목적을 위해 데이터베이스를 공부하면서 배운 몇 가지 기술을 모방하려고합니다. 그리고 MySQL (및 다른 데이터베이스)이이 특정 문제를 어떻게 해결하는지 궁금합니다.데이터베이스의 가변 길이 파일 작성

다른 데이터베이스와 마찬가지로 레코드를 하나의 파일에 나란히 저장하는 응용 프로그램을 작성하고 있습니다. 레코드의 위치를 ​​인덱싱하기 위해 다른 파일을 사용하여 빠르게 찾습니다. 그리고 현재 버전보다 긴 행을 업데이트해야만 정상적으로 작동합니다. 나는 몇 가지 아이디어를 가지고 있지만, 너무 성능 친화적 인 것은 없다.

1,000 레코드 중 200 레코드를 갱신하고 싶다고 가정 해 봅시다. 내 논리에서 행을 시작하는 곳에 파일 커서를 놓고 데이터를 씁니다. 행의 현재 버전이 100 바이트이고 (그리고 101 번째 바이트부터 다음 레코드가 시작한다고 가정 해 봅시다). 새 데이터는 150 바이트 길이이므로 파일 커서를 쓰는 것만으로 다음 레코드의 바이트를 효과적으로 덮어 씁니다.

필자가 아는 바로는 커서에서 파일의 데이터를 "밀어 낼"수 없다는 것입니다. 가능한 경우 가장 성능이 좋은 작업처럼 보이지 않습니다.

새 데이터를 추가하고 현재 행을 NULL 바이트로 바꾸는 옵션이 있습니다. 하지만 그 것 같다가) NULL 바이트 않고 파일을 다시 컴퓨터 작업을 많이 필요로 다시 공간 B)의 낭비,

그리고이 조각 모음의 옵션입니다,하지만 난 준비가 안 그 방향으로 가라.

누구나 다른 데이터베이스가이 문제를 어떻게 처리하는지 알고 있습니까?

답변

2

다른 데이터베이스는 여러 가지 방법으로이를 처리합니다. 나는 MySQL을 위해 대답 할 수있다.

  • 처음으로 파일의 일부 공간에 레코드를 쓰는 경우 약간의 여유 공간을 남겨 둡니다. 여러 레코드가 들어있는 16KB의 "페이지"로 스토리지를 구성하십시오. 그러나 행을 확장 할 수 있도록 처음에는 1/16 공간을 비워 둡니다. 필요에 따라 각 페이지가 RAM에로드되며 페이지가 디스크에 다시 기록되기 전에 해당 페이지의 레코드가 재구성 될 수 있습니다.

  • 레코드가 페이지 공간 이상으로 커지면 분할 될 수 있습니다. 일부 레코드는 다른 새로운 페이지로 재배치 될 수 있습니다. 이는 상당히 떨어져있을 수 있습니다. 레코드의 위치를 ​​추적하는 인덱싱은 레코드가 인접하지 않아도됩니다.

  • 모든 레코드 재구성 및 분할에서 남은 빈 공간은 일부 조각화로 나타나지만 전체 저장소의 작은 비율 일 수 있으므로 걱정하지 않아도됩니다. 결국에는 조각화가 악화 될 수 있으므로 모든 레코드를 새로운 복사본으로 만들어보다 효율적으로 재구성하여 원본을 대체하는 것이 좋습니다. 얼마나 자주이 작업을 수행해야하는지는 데이터베이스에서 수행 한 작업량에 따라 달라 지므로 엄격한 규칙은 없습니다.

  • sparse files 또는 hole-punching과 같이 비교적 최근에 새로 추가 된 기능이 도움이 될 수 있습니다. 전통적으로, 파일의 연속적인 모든 바이트는 유용한 데이터를 해당 바이트에 저장하는지 여부에 관계없이 디스크의 공간을 차지합니다. 그러나 파일 내의 틈이 디스크 공간으로 간주 될 수 있다면 어떨까요? 그럼 당신은 파편화에 신경 쓰지 않을 것입니다. 이것은 모든 파일 시스템에서 지원되는 것은 아니며 "구멍"은 일반적으로 파일 시스템 블록 크기의 배수 (예 : 4KB)로 제한됩니다.

    MySQL 5.7은 page compression 기능에서 구멍 펀칭을 사용합니다. MySQL은 여전히 ​​16KB 페이지에 데이터를 저장하지만 페이지 내에서 선택적으로 압축 할 수 있습니다. 압축이 4KB (파일 시스템 블록의 크기)의 틈을 남겨두면, 압축으로 처리하고 파일 시스템 저장소를 해제합니다.

다른 많은 트릭이 가능합니다. 저장 용량을 바이트 단위로 최적화하려고하면 가치가 없습니다. 다른 데이터 업데이트를 수행하는 즉시 취소해야하기 때문입니다. 일반적으로 빠른 업데이트를 위해 완벽하게 압축 된 저장소보다 최적화하는 것이 좋습니다. 모든 것이 서로 다른 유형의 효율성 (예 : 속도와 스토리지) 사이의 절충점이되며, 데이터베이스에 중요한 요소에 대한 결정을 내려야합니다.

+0

이 답변을 주셔서 감사합니다. :) –