Có rất nhiều thay đổi tôi sẽ phải thực hiện cho câu trả lời đầu tiên của mình, tôi bắt đầu cái này !!!
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;
Các bảng nhỏ hơn nhiều cho thông tin năm nhưng các phím lớn hơn nhiều để giữ ngram gốc. Tôi cũng tăng số lượng dữ liệu thử nghiệm. Bạn có thể cắt và dán trực tiếp vào MySQL.
CAUPAT
Chỉ cần xóa ROW_FORMAT và nó sẽ trở thành dymanic và nén các bảng ngram_key nhỏ hơn rất nhiều.
Số liệu của DiskSpace
nrgram_rec có 17 byte mỗi hàng
8 byte cho ngram_id (giá trị không dấu tối đa 18446744073709551615 [2 ^ 64 - 1])
8 byte cho 4 gợi ý nhỏ (mỗi byte 2 byte)
1 cờ xóa nội bộ MyISAM
Mục nhập mục tiêu cho ngram_rec = 10 byte (8 (ngram_id) + 2 (năm)
47 triệu hàng X 17 byte mỗi hàng = 0799 triệu byte = 761.98577 MB
47 triệu hàng X 12 byte mỗi hàng = 0564 triệu byte = 537.85231 MB
47 triệu hàng X 29 byte mỗi hàng = 1363 triệu byte = 1.269393 GB
5 tỷ hàng X 17 byte mỗi hàng = 085 tỷ byte = 079.1624 GB
5 tỷ hàng X 12 byte mỗi hàng = 060 tỷ byte = 055.8793 GB
5 tỷ hàng X 29 byte mỗi hàng = 145 tỷ byte = 135.0417 GB
ngram_key có 73 byte 64 byte cho ngram (ROW_FORMAT = FIXED đặt varchar thành char) 8 byte cho ngram_id 1 byte cờ xóa nội bộ MyISAM
2 mục nhập chỉ mục cho ngram_key = 64 byte + 8 byte = 72 byte
47 triệu hàng X 073 byte mỗi hàng = 3431 triệu byte = 3.1954 GB
47 triệu hàng X 072 byte mỗi hàng = 3384 triệu byte = 3.1515 GB
47 triệu hàng X 145 byte mỗi hàng = 6815 triệu byte = 6.3469 GB
5 tỷ hàng X 073 byte mỗi hàng = 365 tỷ byte = 339.9327 GB
5 tỷ hàng X 072 byte mỗi hàng = 360 tỷ byte = 335.2761 GB
5 tỷ hàng X 145 byte mỗi hàng = 725 tỷ byte = 675.2088 GB