앞서 언급했듯이 스냅샷 콘텐츠가 대용량 텍스트 저장소인 db에 직접 저장되는 클라우드 문서 프로젝트가 있습니다. 문서 스냅샷의 콘텐츠 필드는 대부분 kb 수준에 있으며 일부는 심지어 kb 수준입니다. MB 수준. 현재 데이터 읽기를 위한 CDN 캐싱 최적화가 수행되었습니다(정적 리소스 캐싱 도구 - CDN). 데이터 쓰기 및 저장은 여전히 최적화가 필요합니다. 일부 압축 알고리즘을 사용하여 대용량 텍스트를 압축하고 저장할 수 있습니다. DB 저장 공간을 대폭 절약하고 DB I/O 부담을 완화합니다.
select table_name as '表名', table_rows as '记录数', truncate(data_length/1024/1024, 2) as '数据容量(MB)', truncate(index_length/1024/1024, 2) as '索引容量(MB)', truncate(DATA_FREE/1024/1024, 2) as '碎片占用(MB)' from information_schema.tables where table_schema=${数据库名} order by data_length desc, index_length desc;
innodb의 기본 페이지 블록 크기는 16k인 것을 모두 알고 있습니다. 테이블의 데이터 행 길이가 16k를 초과하면 행 오버플로가 발생하고 오버플로된 행은 다른 위치(압축 해제 Blob 페이지)에 저장됩니다. innodb는 데이터를 저장하기 위해 클러스터링된 인덱스, 즉 B+Tree 구조를 사용하므로 각 페이지 블록에는 최소 2개의 데이터 행이 있습니다. 그렇지 않으면 B+Tree의 의미가 손실되므로 한 행의 최대 길이 제한은 다음과 같습니다. 데이터는 8k입니다(대형 필드는 데이터 페이지에 768바이트의 데이터를 저장하고 나머지 데이터는 다른 페이지로 오버플로됩니다. 데이터 페이지에도 오버플로 페이지의 주소를 기록하기 위한 20바이트가 있습니다)
파일의 홀 부분은 디스크 공간을 차지하지 않으며, 파일이 차지하는 디스크 공간은 여전히 연속적입니다
이 적용 가능합니다. 시나리오: 데이터 양이 많고 디스크 공간이 부족하여 부하가 주로 IO에 반영되고, 서버의 CPU 여유가 상대적으로 큽니다. .
관련 문서: dev.mysql.com/doc/refman/…
관련 문서: dev.mysql.com/doc/refman/…
홀
기능을 지원해야 함) 空洞
特性)ALTER TABLE xxx COMPRESSION = ZLIB
可以启用TPC页压缩功能,但这只是对后续增量数据进行压缩,如果期望对整个表进行压缩,则需要执行 OPTIMIZE TABLE xxx
实现过程:一个压缩页在缓冲池中都是一个16K的非压缩页,只有在数据刷盘的时候,会进行一次压缩,压缩后剩余的空间会用 0x00 填满,利用文件系统的空洞特性(hole punch)对文件进行裁剪,释放 0x00 占用的稀疏空间
MySQL目前没有直接针对列压缩的方案,有一个曲线救国的方法,就是在业务层使用MySQL提供的压缩和解压函数来针对列进行压缩和解压操作。也就是如果需要对某一列做压缩,在写入时调用COMPRESS
函数对那个列的内容进行压缩,读取的时候,使用UNCOMPRESS
函数对压缩过的数据进行解压。
COMPRESS()
UNCOMPRESS()
LENGTH()
UNCOMPRESSED_LENGTH()
insert into xxx (content) values (compress('xxx....'))
读取压缩的数据:select c_id, uncompressed_length(c_content) uncompress_len, length(c_content) compress_len from xxx
ALTER TABLE xxx COMPRESSION = ZLIB
TPC 페이지 압축 기능을 활성화할 수 있지만 이는 예상되는 경우 후속 증분 데이터만 압축합니다. 전체 테이블을 압축하려면 OPTIMIZE TABLE xxx
COMPRESS
함수를 호출하여 해당 열의 내용을 압축하고, 압축된 내용을 압축하려면 UNCOMPRESS
함수를 사용하세요. 읽을 때 데이터가 압축 해제됩니다. 🎜🎜🎜사용 시나리오: 테이블에 있는 일부 열의 데이터 길이가 상대적으로 긴 상황(보통 varchar, text, blob, json 및 기타 데이터 유형)의 경우🎜🎜관련 함수: 🎜🎜압축 함수: COMPRESS( )</code >🎜🎜압축 해제 함수: <code>UNCOMPRESS()
🎜🎜문자열 길이 함수: LENGTH()
🎜🎜압축 해제된 문자열 길이 함수: UNCOMPRESSED_LENGTH()< /code>🎜🎜🎜🎜테스트: 🎜🎜데이터 삽입: <code>xxx(콘텐츠) 값에 삽입 (compress('xxx....'))
🎜🎜🎜압축된 데이터 읽기: < code>xxx에서 c_id, uncompressed_length(c_content) uncompress_len, length(c_content) 압축_len 선택🎜🎜🎜🎜🎜🎜
🎜🎜SELECT NAME, FS_BLOCK_SIZE, FILE_SIZE, ALLOCATED_SIZE FROM information_schema.INNODB_TABLESPACES WHERE NAME like 'test_compress%';
FS_BLOCK_SIZE
:文件系统块大小,也就是打孔使用的单位大小FILE_SIZE
:文件的表观大小,表示文件的最大大小,未压缩ALLOCATED_SIZE
:文件的实际大小,即磁盘上分配的空间量压缩率:
【相关推荐:mysql视频教程】
위 내용은 MySQL에서 대용량 텍스트 저장소를 압축하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!