我主要使用这三个表在MySQL中实现了倒排索引:
WORDS (word_id, word)
INSTANCES (word_id, doc_id)
DOCUMENT (id, text)
其中word_id
为INT
且doc_id
为BIGINT
然后,我尝试将WORDS和INSTANCES表去规范化为一个:
INSTANCES_NEW (word, doc_id)
其中单词现在为VARCHAR(50)
,doc_id
为BIGINT
表INSTANCES和INSTANCES_NEW同时具有word_id/word
和doc_id
的两个索引。对于相同的数据,INSTANCES显示为占用146MB,而INSTANCES_NEW显示为占用122.7MB。 INT
如何占用比VARCHAR(50)
更多的空间?几乎所有单词至少需要3个字符 - 所以从理论上讲,所占用的空间应该增加一倍以上。
答案 0 :(得分: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)大得多,而数据大小几乎相同。正如我想的那样,大小的差异来自索引大小,而数据大小的这个小差异可以通过行数的微小差异来解释(大约)
答案 1 :(得分:1)
int是4个字节,varchar大小取决于字符编码。如果是单字节编码,则3个字符的字只需要3个字节。这种尺寸差异看起来是正确的。