2009-10-14 4 views
1

나는 현재 약 70M 행이고 수천명이 매일 증가하고있는 매우 큰 테이블을 가지고 있는데,이 스키마는 매일 바뀌어서 분할 된 테이블로 이동하고 있습니다. ddl 재 설계mysql 7columns pk 대 1 열 md5 unique constraint

테이블은 기본적으로 7 개의 열 집합에 대해 고유 한 제약 조건이 필요한 NOT NULL INTEGERS (일부 중간 INT 일부 작음) 컬렉션입니다 (테이블의 열이 더 많음) 이것은 매우 비쌉니다. 삽입 당 계산하고 인덱스 파일 크기를 훨씬 더 증가시킵니다. 그걸로 검색 할 수 없기 때문에 나는 그것을 삭제하고 어떻게 든 md5/어쩌면 단순한 concat 값을 ... 선호합니다. 아직 알지 못합니다.

문제는이 큰 고유 번호를 보유 할 수있는 유일한 열 유형은 varchar입니다.이 PK가 실제로 더 좋을지는 의문입니다. 내가 PRIMARY KEY 'part_key'(site_id, id)를 갖기 때문에 은 파티션 설계의 고유 한 제약 조건을 받아 들여야 만합니다 ... 이것이 새로운 문제는 아니지만 두 벤치 마크/문서를 비교할 수 없었습니다.이 문제에 대한 경험이있는 사람이 있습니까? 질문은 진짜 PK가 전체 필드가 ​​될 것입니다 (이 테이블에는 아마도 100M 이상의 행이있을 것입니다). 고유 필드의 pk 또는 단지 해시 값을 검색하지 않을 때 추신 : 검색 중 주로 7 열 중 2 열을 수행합니다 디스크 크기는 문제가되지 않습니다 감사합니다.

답변

0

mysql이 파티션 정리를 가져올 때까지는 (gulp) 가짜 파티션으로 테이블을 비정규 화하는 것이 좋습니다. 첫 번째 가치의 32를 승계하고 32 개의 테이블을 만드는 것과 같은 것을하십시오.

갱신 : 나의 강력한 조언은 다음 MySQL이 가능하여 7 열 중 하나의 해시 값을 사용하여, 당신을 위해 파티션을 처리 할 수 ​​있도록, 업그레이드하는 것입니다 분명히 5.1.6 MySQL과 이후 지원 치기 (http://dev.mysql.com/doc/refman/5.1/en/partitioning-pruning.html을) 할 .

0

레코드 조회와 일치하는 좋은 해시를 찾을 수 있다면 각 파티션에 고유 한 제약 조건을 적용하면 큰 문제가되지 않습니다. 파티션 크기가 작을수록 고유 한 제약 조건을 덜 비쌉니다. (내가 틀렸다면, 여기 누군가가 나를 학교에 데려다 줄 것이다.).

저는 MySQL 5.0을 고수했습니다. 40M 행을 넘는 몇 개의 테이블을 수동으로 파티션하는 것에 직면하고 있습니다. 내 응용 프로그램에서 해시 할 수있는 문서 ID가 있습니다 (floor(docID/10)%100). 이것은 나에게 100 개의 파티션을 줄 수 있고 인덱스 크기를 현저하게 줄여야합니다. 나는 테이블에 대한 쿼리를 수행하여 해시로 행 수를 계산했습니다.

select count(docID), floor(docID/10)%100 as partno 
from documents 
group by partno 

운 좋게도, 첫 번째 시도에서 매우 균일 한 분포를 발견했습니다. 자신의 수식이 다를 수 있습니다, 나는 당신의 분포가 어떻게 될지 전혀 모른다. 당신은 당신의 유일한 제약이 파티셔닝에 직면하지 않을까 우려하고 있습니까?

MySQL 파티셔닝을 활용할 수 있다면 응용 프로그램에 영향을 미치지 않을 것입니다.