내 첫 번째 답변을 변경해야 할 내용이 너무 많아서 이것을 시작했습니다 !!!
USE test
DROP TABLE IF EXISTS ngram_key;
DROP TABLE IF EXISTS ngram_rec;
DROP TABLE IF EXISTS ngram_blk;
CREATE TABLE ngram_key
(
NGRAM_ID UNSIGNED BIGINT NOT NULL AUTO_INCREMENT,
NGRAM VARCHAR(64) NOT NULL,
PRIMARY KEY (NGRAM),
KEY (NGRAM_ID)
) ENGINE=MyISAM ROW_FORMAT=FIXED PARTITION BY KEY(NGRAM) PARTITIONS 256;
CREATE TABLE ngram_rec
(
NGRAM_ID UNSIGNED BIGINT NOT NULL,
YR SMALLINT NOT NULL,
MC SMALLINT NOT NULL,
PC SMALLINT NOT NULL,
VC SMALLINT NOT NULL,
PRIMARY KEY (NGRAM_ID,YR)
) ENGINE=MyISAM ROW_FORMAT=FIXED;
CREATE TABLE ngram_blk
(
NGRAM VARCHAR(64) NOT NULL,
YR SMALLINT NOT NULL,
MC SMALLINT NOT NULL,
PC SMALLINT NOT NULL,
VC SMALLINT NOT NULL
) ENGINE=BLACKHOLE;
DELIMITER $$
CREATE TRIGGER populate_ngram AFTER INSERT ON ngram_blk FOR EACH ROW
BEGIN
DECLARE NEW_ID BIGINT;
INSERT IGNORE INTO ngram_key (NGRAM) VALUES (NEW.NGRAM);
SELECT NGRAM_ID INTO NEW_ID FROM ngram_key WHERE NGRAM=NEW.NGRAM;
INSERT IGNORE INTO ngram_rec VALUES (NEW_ID,NEW.YR,NEW.MC,NEW.PC,NEW.VC);
END; $$
DELIMITER ;
INSERT INTO ngram_blk VALUES
('rolando',1965,31,29,85),
('pamela',1971,33,21,86),
('dominique',1996,30,18,87),
('diamond',1998,13,28,88),
('rolando edwards',1965,31,29,85),
('pamela edwards',1971,33,21,86),
('dominique edwards',1996,30,18,87),
('diamond edwards',1998,13,28,88),
('rolando angel edwards',1965,31,29,85),
('pamela claricia edwards',1971,33,21,86),
('dominique sharlisee edwards',1996,30,18,87),
('diamond ashley edwards',1998,13,28,88);
UPDATE ngram_rec SET yr=yr+1,mc=mc+30,pc=pc+30,vc=vc+30;
INSERT INTO ngram_blk VALUES
('rolando',1965,31,29,85),
('pamela',1971,33,21,86),
('dominique',1996,30,18,87),
('diamond',1998,13,28,88),
('rolando edwards',1965,31,29,85),
('pamela edwards',1971,33,21,86),
('dominique edwards',1996,30,18,87),
('diamond edwards',1998,13,28,88),
('rolando angel edwards',1965,31,29,85),
('pamela claricia edwards',1971,33,21,86),
('dominique sharlisee edwards',1996,30,18,87),
('diamond ashley edwards',1998,13,28,88);
UPDATE ngram_rec SET yr=yr+1,mc=mc+30,pc=pc+30;
INSERT INTO ngram_blk VALUES
('rolando',1965,31,29,85),
('pamela',1971,33,21,86),
('dominique',1996,30,18,87),
('diamond',1998,13,28,88),
('rolando edwards',1965,31,29,85),
('pamela edwards',1971,33,21,86),
('dominique edwards',1996,30,18,87),
('diamond edwards',1998,13,28,88),
('rolando angel edwards',1965,31,29,85),
('pamela claricia edwards',1971,33,21,86),
('dominique sharlisee edwards',1996,30,18,87),
('diamond ashley edwards',1998,13,28,88);
UPDATE ngram_rec SET yr=yr+1,mc=mc+30;
SELECT * FROM ngram_key;
SELECT * FROM ngram_rec;
SELECT A.ngram NGram,B.yr Year,B.mc Matches,B.pc Pages,B.vc Volumes FROM
ngram_key A,ngram_rec B
WHERE A.ngram='rolando angel edwards'
AND A.ngram_id=B.ngram_id;
연도 정보의 경우 훨씬 작은 테이블이지만 원래 ngram을 유지하기위한 키는 훨씬 큽니다. 또한 테스트 데이터의 양을 늘 렸습니다. 이것을 잘라내어 MySQL에 직접 붙여 넣을 수 있습니다.
경고
ROW_FORMAT을 제거하면 동적이되고 ngram_key 테이블을 훨씬 작게 압축 할 수 있습니다.
DiskSpace 지표
nrgram_rec에는 ngram_id에 대해 행당 17 바이트가
8 바이트입니다 (최대 부호없는 값 18446744073709551615 [2 ^ 64-1])
4 개의 smallints에 대해 8 바이트 (각 2 바이트)
1 바이트 MyISAM 내부 삭제 플래그
ngram_rec = 10 바이트의 색인 항목 (8 (ngram_id) + 2 (yr))
47 백만 행 X 행당 17 바이트 = 7 억 9700 만 바이트 = 761.98577MB
47 백만 행 X 행당 12 바이트 = 0564 백만 바이트 = 537.85231MB
47 백만 행 X 행당 29 바이트 = 1 억 3,600 만 바이트 = 1.269393GB
50 억 행 X 행당 17 바이트 = 085 억 바이트 = 079.1624GB
50 억 행 X 행당 12 바이트 = 0,600 억 바이트 = 055.8793GB
50 억 행 X 행당 29 바이트 = 145 억 바이트 = 135.0417GB
ngram_key는 ngram의 경우 73 바이트 64 바이트 (ROW_FORMAT = FIXED varchar를 char로 설정) ngram_id의 경우 8 바이트 1 바이트 MyISAM 내부 삭제 플래그
ngram_key = 64 바이트 + 8 바이트 = 72 바이트에 대한 2 개의 인덱스 항목
47 백만 행 X 행 073 바이트 = 3 억 3,400 만 바이트 = 3.1954GB
47 백만 행 X 행 072 바이트 = 3384 백만 바이트 = 3.1515GB
47 백만 행 X 행 145 바이트 = 6815 백만 바이트 = 6.3469GB
50 억 행 × 행당 073 바이트 = 365 억 바이트 = 339.9327GB
50 억 행 × 행당 072 바이트 = 360 억 바이트 = 335.2761GB
50 억 행 × 행당 145 바이트 = 725 억 바이트 = 675.2088GB