매일 다른 자원의 조합에 대한 값을 추적해야합니다. 그래서이 작업을 수행하는 테이블이 보일 수 있습니다 같은 :복합 키의 수직 분할
res5
에 이르기까지
res1
는 해당 테이블에 대한 foreign 키입니다
CREATE TABLE `data` (
`id` INT UNSIGNED NULL PRIMARY KEY AUTO_INCREMENT,
`datetime` DATETIME NOT NULL,
`res1` INT UNSIGNED NOT NULL,
`res2` INT UNSIGNED NOT NULL,
`res3` INT UNSIGNED NOT NULL,
`res4` INT UNSIGNED NOT NULL,
`res5` INT UNSIGNED NOT NULL,
`value` DECIMAL(10,0) NOT NULL,
UNIQUE INDEX `datetime_res1_to_res5` (`datetime`, `res1`, `res2`, `res3`, `res4`, `res5`)
)
.
이 표에는 많은 행이 들어있어 쉽게 2,000 만 개가됩니다.
CREATE TABLE `data` (
`id` INT UNSIGNED NULL PRIMARY KEY AUTO_INCREMENT,
`datetime` DATETIME NOT NULL,
`superKeys_id` INT UNSIGNED NOT NULL,
`value` DECIMAL(10,0) NOT NULL,
UNIQUE INDEX `datetime_superKeys_id` (`datetime`, `superKeys_id`)
)
CREATE TABLE `superKeys` (
`id` INT UNSIGNED NULL PRIMARY KEY AUTO_INCREMENT,
`res1` INT UNSIGNED NOT NULL,
`res2` INT UNSIGNED NOT NULL,
`res3` INT UNSIGNED NOT NULL,
`res4` INT UNSIGNED NOT NULL,
`res5` INT UNSIGNED NOT NULL,
UNIQUE INDEX `res1_to_res5` (`res1`, `res2`, `res3`, `res4`, `res5`)
)
data
: 나는 그래서 같은 두 개의 테이블을 가지고 있도록, 별도의 테이블에 외래 키의 조합을 넣어하는 경우는 내가의 궁금 무엇
이다. superKeys_id
은 superKeys
의 외래 키입니다. id
.
이렇게하면 테이블 크기가 크게 줄어 듭니다. 그러나 내가 모르는 이유로 나쁜 생각 일지 모르겠다. 분명히 select는 데이터의 붕괴를 가져 오기 위해 조인을 필요로 할 것이고 이것은 약간의 오버 헤드를 추가 할 것이지만 이것이 문제가 될 것이라고 생각해서는 안됩니다.
제 실제 상황에서는 리소스 중 하나가 user_id이고 자주 사용자의 값을 합산해야하므로 superKeys
테이블의 일부가 아닌 data
에 이러한 열을 유지하는 것이 좋습니다. 모든 쿼리에 참여하지 않아도됩니다. 그런 다음 다른 자원에 대한 값을 더 적게 합산해야하는 경우에만 조인을 사용하십시오.
대용 암호 키'id'를 모두 생략 할 수 있습니까? res1 ... res5가 자연스러운 고유 키이면 다른 키가 불필요합니다. – wildplasser
5 개보다 많거나 적은 리소스를 비교해야합니까? 이것은 고도로 비정규 화 된 스키마처럼 보입니다. –
예, 테이블의 "핫"절반에 대한 I/O를 최소화하기 위해 수직 분할을 수행 할 수 있습니다. 그러나 이것은 대용량 테이블에 대해서만 의미가 있으며, 2 천만 개는 @Catcall (너무 웅변으로 설명) (http://stackoverflow.com/a/14823645/533120) (+ 그에게 1). –