2012-01-09 63 views
3

我主要使用這三個表來實現在MySQL倒排索引:奇怪的MySQL表大小

WORDS (word_id, word) 
INSTANCES (word_id, doc_id) 
DOCUMENT (id, text) 

其中word_idINTdoc_idBIGINT

於是,我試圖去規範的文字和INSTANCES表到一個:

INSTANCES_NEW (word, doc_id) 

其中一句話是現在VARCHAR(50)doc_idBIGINT

表INSTANCES和INSTANCES_NEW同時具有兩個索引word_id/worddoc_id。對於相同的數據,INSTANCES顯示爲146MB,而INSTANCES_NEW顯示爲122.7MB。 INT如何比VARCHAR(50)佔用更多空間?幾乎所有的單詞至少需要3個字符 - 理論上所用的空間應該增加一倍以上。

回答

3

如果不知道您的數據很困難,但您的索引大小可能存在差異。正如你所說,你對這些表有不同的索引......對於第一個索引你有word_id/word,對於第二個索引你有word/doc_id。所以你的索引有不同數量的條目,最有可能有不同的大小。您可以執行SHOW TABLE STATUS以獲得更好的想法(也可以將其發佈到此處,以便我們可以一起分析)。

編輯: 所以,你的結果是:

實例

總行數:1348741

平均行長度:40B

數據:52.57MB

指數:93.20MB

總:145.77MB

instances_new

總行數:1383266

平均行長度:42B

數據:56.57MB

指數:66.14MB

總計:122.71MB

正如你所看到的,你的實例索引表(99.2MB)比第二種情況下(66.14MB)大得多,而數據幾乎是相同的大小。所以我認爲,大小的差異來自索引大小,而數據大小的這種小差異可以通過行數的小差異來解釋(約。)

+0

感謝您的回覆。這是一個SHOW TABLE STATUS結果: [鏈接](http://pastebin.com/SFMgrVL8) – dscer 2012-01-09 20:27:02

+0

這非常有趣。爲什麼字符串而不是整數的索引較小? – dscer 2012-01-09 21:51:14

+0

你能告訴我你的索引是什麼嗎?如果我理解的很好,你沒有在整數和字符串上的索引,但在兩列上的複合索引... – 2012-01-09 22:16:10

1

int是4個字節,varchar的大小取決於字符編碼。如果是單字節編碼,則3個字符的字只需要3個字節。這種尺寸差異看起來是正確的。

+0

我使用UTF-8作爲字符編碼,因此每個字符都應占用4個字節。 – dscer 2012-01-09 20:16:46