มีการเปลี่ยนแปลงมากมายที่ฉันจะต้องทำกับคำตอบแรกของฉันฉันเริ่มต้น !!!
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 ออกแล้วมันจะกลายเป็น dymanic และบีบอัดตาราง ngram_key ให้เล็กลงมาก
ตัวชี้วัด DiskSpace
nrgram_rec มี 17 ไบต์ต่อแถว
8 ไบต์สำหรับ ngram_id (ค่าสูงสุดที่ไม่ได้ลงนาม 18446744073709551615 [2 ^ 64 - 1])
8 ไบต์สำหรับ 4 smallints (2 ไบต์ต่อหน้า)
1 ไบต์ลบธง MyISAM ภายใน 1
รายการดัชนีสำหรับ ngram_rec = 10 ไบต์ (8 (ngram_id) + 2 (ปี))
47 ล้านแถว X 17 ไบต์ต่อแถว = 0799 ล้านไบต์ = 761.98577 MB
47 ล้านแถว X 12 ไบต์ต่อแถว = 0564 ล้านไบต์ = 537.85231 MB
47 ล้านแถว X 29 ไบต์ต่อแถว = 1363 ล้านไบต์ = 1.269393 GB
5 พันล้านแถว X 17 ไบต์ต่อแถว = 085 พันล้านไบต์ = 079.1624 GB
5 พันล้านแถว X 12 ไบต์ต่อแถว = 060 ล้านไบต์ = 055.8793 GB
5 ล้านแถว X 29 ไบต์ต่อแถว = 145 ล้านไบต์ = 135.0417 GB
ngram_key มี 73 ไบต์ 64 ไบต์สำหรับ ngram (ROW_FORMAT = แก้ไขชุด varchar ให้เป็นถ่าน) 8 ไบต์สำหรับ ngram_id 1 ไบต์แฟล็กการลบภายใน MyISAM
2 รายการดัชนีสำหรับ ngram_key = 64 ไบต์ + 8 ไบต์ = 72 ไบต์
47 ล้านแถว X 073 ไบต์ต่อแถว = 3431 ล้านไบต์ = 3.1954 GB
47 ล้านแถว X 072 ไบต์ต่อแถว = 3384 ล้านไบต์ = 3.1515 GB
47 ล้านแถว X 145 ไบต์ต่อแถว = 6815 ล้านไบต์ = 6.3469 GB
5 พันล้านแถว X 073 ไบต์ต่อแถว = 365 ล้านไบต์ = 339.9327 GB
5 พันล้านแถว X 072 ไบต์ต่อแถว = 360 ล้านไบต์ = 335.2761 GB
5 พันล้านแถว X 145 ไบต์ต่อแถว = 725 พันล้านไบต์ = 675.2088 GB