Було так багато змін, які я повинен був би внести до своєї першої відповіді.
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 має 17 байт у рядку
8 байт для ngram_id (максимальне неподписане значення 18446744073709551615 [2 ^ 64 - 1])
8 байт для 4 малих тонів (2 байти кожен)
1 байт внутрішнього прапора MyISAM
Запис індексу для ngram_rec = 10 байт (8 (ngram_id) + 2 (yr))
47 мільйонів рядків X 17 байт у рядку = 0799 мільйонів байт = 761,98577 МБ
47 мільйонів рядків X 12 байт у рядку = 0564 мільйонів байтів = 537,85231 МБ
47 мільйонів рядків X 29 байт за рядок = 1363 мільйонів байт = 1,2269393 ГБ
5 мільярдів рядків X 17 байт у рядку = 085 мільярдів байт = 079.1624 ГБ
5 мільярдів рядків X 12 байтів за рядок = 060 мільярдів байт = 055,8793 ГБ
5 мільярдів рядків X 29 байт за рядок = 145 мільярдів байт = 135,0417 ГБ
ngram_key має 73 байти 64 байти для ngram (ROW_FORMAT = ФІКСОВАНО встановити варшар у char) 8 байт для ngram_id 1 байт внутрішнього прапора MyISAM
2 Індексні записи для ngram_key = 64 байти + 8 байт = 72 байти
47 мільйонів рядків X 073 байт у рядку = 3431 мільйонів байт = 3,1954 ГБ
47 мільйонів рядків X 072 байт у рядку = 3384 мільйонів байтів = 3,1515 ГБ
47 мільйонів рядків X 145 байт на рядок = 6815 мільйонів байт = 6,3469 ГБ
5 мільярдів рядків X 073 байт у рядку = 365 мільярдів байт = 339,9327 ГБ
5 мільярдів рядків X 072 байт на рядок = 360 мільярдів байт = 335,2761 ГБ
5 мільярдів рядків X 145 байт в ряд = 725 мільярдів байт = 675,2088 ГБ