2017-02-08 5 views
0

나는 매일 다른 파티션에 타임 스탬프로 분할 된 테이블을 가지고있다.mysql 파티션 압축

매일 약 10 억 건의 이벤트가 수신됩니다. 각 이벤트에는 오브젝트로 태그가 지정되며, 비즈니스 로직은 오브젝트가 이벤트를 처리하기 위해 모든 이벤트를 필요로합니다. 따라서 시스템에는 객체 당 하나의 행 (하루에 수억 개의 행)이있는 큰 테이블이 있으며 이러한 이벤트는 '이벤트 버퍼'중간 텍스트로 연결됩니다.

개체 당 하나의 행이 실제로 잘 작동합니다. 비즈니스 논리 및보고 기능을 사용하기에 매우 빠르고 적합합니다. 옛날 옛적에 우리는 이벤트 테이블로 시작하여 대신 참여했으며, 너무 느립니다.

5 일 후에 더 이상 이벤트가 수신되지 않습니다. 이 시점에서 우리가 이벤트를 종료하지 않았다면 우리 시스템은 우리 자신의 '시간 초과 된'이벤트를 버퍼에 추가합니다.

객체에 대한 이벤트가 수신 될 때 우리는 비즈니스 로직을 많이하고있다, 우리가 "온라인"시스템은 5 일을 원하지만 객체가 더 최종 이벤트 등

이없는 플래그 부울이

개체 이벤트의 경우보고 시스템은 1 년 가치가 필요합니다.

5 일 이상 된 파티션을 압축하려고합니다. 나는 이것을 유발하기 위해 크론 작업을 할 수있다.

현재 접근법은 다음과 같습니다. 온라인 테이블과 동일한 스키마와 파티셔닝이 있지만 row_format = compressed 인 다른 테이블이 있습니다. 그런 다음 매일이 테이블과 같은 새 테이블을 만들지 만 파티셔닝은하지 않습니다. 먼저 5 일 된 파티션을 스왑 아웃하기 위해 ALTER TABLE EXCHANGE PARTITION입니다. 그런 다음이 테이블을 새 테이블에 삽입합니다.

현재 접근 방식에는 두 가지 문제가 있습니다. 1)보고 도구가 두 개의 개별 테이블을 스캔해야하고, 2) 개체가 주 테이블에 있지 않을 때 경쟁 조건이 있다는 것입니다.

개별 파티션의 경우 ALTERrow_format이 가능합니까?

답변

1

아니요, 개별 파티션을 압축 할 수 없습니다. 테이블의 기본 속성은 모든 파티션에서 동일합니다.

표 크기와 0123의 정보를 제공하고 "왜"압축해야하는지 자세히 설명하십시오. 비슷한 기능을 수행하는 해결 방법이있을 수 있습니다.

보고

"보고서는"일반적으로 "요약"정보, 모든 원시 데이터가 필요합니다. 그래서 ... 매일 데이터 (또는 시간 등)를 요약하고 요약을 더 작은 테이블에 넣으십시오. 그런 다음 원시 데이터를 버립니다.

나중에 데이터에서 원시 데이터가 필요하다면 압축 된 로그를 일반 파일에 저장하십시오. 물론 오래된 데이터를 끌어 올리는 데는 몇 가지 추가 작업이 필요합니다. 하지만 트레이드 오프가 있습니다.

이것은 또한 간섭 - 다른 테이블, 작은 테이블을 해결합니다.

요약하면 일반적으로 주기적으로 수행하지만 데이터가 원시 ("사실") 테이블에 삽입 될 때 수행 할 수 있습니다. Summary tablesHigh speed ingestion을 참조하십시오.이후 링크에서는 "스테이징 테이블"에서 데이터를 모으고 매거진을 작성하여 팩트 테이블에 보내고, 정규화 테이블 (아마도 갖고 있지 않은 테이블)에 점진적 요약을 수행하는 방법을 설명합니다.

원시 데이터는 6 시간 단위로 분할 될 수 있습니다 (PARTITION BY RANGE(TO_DAYS(...))). 30 파티션은 꽤 좋은 숫자입니다 (타협). 요약 테이블을 분할해야 할 수도 있습니다. 1 년 후 폐기하는 경우 12 또는 52를 고려하십시오. (실제로 14 또는 54; 이유에 대한 링크를 참조하십시오.)

는 다른, 더 압축 된 테이블에 6 일 된 파티션을 움직일 수 있다고 가정 파티션을 마이그레이션; UNION 앞에있는 VIEW을 사용하여 분할의 존재를가립니다.

5.7이있는 경우 "테이블 공간을 내보내는"것이 매우 쉽습니다. 파티션을 테이블로 변환합니다. 그런 다음 다른 파티션 테이블로 가져올 수도 있습니다 (그렇지 않으면 매우 유용하지 않습니다). 그렇지 않으면 데이터를 변환하여 축소합니다.

큰 텍스트 열 수동 압축

, 나는 BLOB (대신 TEXT의)에 저장, 클라이언트에서 압축하고, 나가는 길에 압축 해제하는 것이 좋습니다. 이렇게하면 디스크 공간 (일반적인 영어, 코드, xml 등의 경우 3 배)과 대역폭 (클라이언트에서 /로 - 특히 클라이언트와 서버가 멀리 떨어져있는 경우)이 절약됩니다.

데이터베이스 API 레이어

당신은 사용자가 SQL 쿼리를 발행했다? 클라이언트와 데이터베이스간에 단순한 계층을 제공하는 것을 진지하게 고려해야합니다. 이를 통해 뷰, 유니온, 압축, 두 개의 테이블 등을 숨길 수 있습니다. 그리고 고객이 변경하지 않고 변경할 수 있습니다. 클라이언트를 이해하고보다 일반적인 '느낌'을 느낄 수있는 API를 만들어야합니다. GetObject(1234)은 SQL이 필요한 모든 것을 수행 한 다음 동의 형식 (JSON, XML, PHP 구조 등)에 따라 "object # 1234"를 반환합니다.

+0

Thx. 배경을 추가했습니다. – Will

+0

Sigh. 내 보고서에는 행당 개체 데이터가 필요합니다. 데이터는 하루에 수 GB를 사용하며 압축하면 크기가 커진 단일 상자에 1 년을 저장할 수 있습니다. 그러나 온라인 시스템이 구축하고있는 파티션을 압축하면 성능이 많이 떨어집니다. 따라서 파티션을 압축하는 두 세계의 장점을 원한다면 5 일이 넘기 때문에 다시 쓰지 않을 것입니다. 두 개 이상의 테이블이있는 즉시 사용자는 두 개 이상의 테이블을 쿼리해야합니다. 나는 뷰 조합을 생각했지만 임시 테이블은 그렇게 어렵게 만듭니다. – Will

+0

더 많은 생각을 추가했습니다. –