Ada begitu banyak perubahan yang harus saya buat pada jawaban pertama saya Saya mulai yang ini !!!
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;
Tabel yang jauh lebih kecil untuk info tahun tetapi kunci yang lebih besar untuk mempertahankan ngram asli. Saya juga meningkatkan jumlah data uji. Anda dapat memotong dan menempelkan ini langsung ke MySQL.
CAVEAT
Cukup hapus ROW_FORMAT dan itu menjadi dymanic dan kompres tabel ngram_key jauh lebih kecil.
Metrik DiskSpace
nrgram_rec memiliki 17 byte per baris
8 byte untuk ngram_id (nilai maksimum unsigned 18446744073709551615 [2 ^ 64 - 1])
8 byte untuk 4 smallints (masing-masing 2 byte)
1 byte MyISAM flag internal delete flag
Entri Indeks untuk ngram_rec = 10 byte (8 (ngram_id) + 2 (tahun))
47 juta baris X 17 byte per baris = 0799 juta byte = 761.98577 MB
47 juta baris X 12 byte per baris = 0564 juta byte = 537.85231 MB
47 juta baris X 29 byte per baris = 1363 juta byte = 1.269393 GB
5 miliar baris X 17 byte per baris = 085 miliar byte = 079,1624 GB
5 miliar baris X 12 byte per baris = 060 miliar byte = 055.8793 GB
5 miliar baris X 29 byte per baris = 145 miliar byte = 135,04 GB GB
ngram_key memiliki 73 byte 64 byte untuk ngram (ROW_FORMAT = TETAP mengatur varchar ke char) 8 byte untuk ngram_id 1 byte MyISAM flag hapus internal
2 Entri Indeks untuk ngram_key = 64 byte + 8 byte = 72 byte
47 juta baris X 073 byte per baris = 3431 juta byte = 3,1954 GB
47 juta baris X 072 byte per baris = 3384 juta byte = 3,1515 GB
47 juta baris X 145 byte per baris = 6815 juta byte = 6,3469 GB
5 miliar baris X 073 byte per baris = 365 miliar byte = 339.9327 GB
5 miliar baris X 072 byte per baris = 360 miliar byte = 335,2761 GB
5 miliar baris X 145 byte per baris = 725 miliar byte = 675,2088 GB