奇怪的MySQL表格大小

时间:2012-01-09 18:55:33

标签: mysql indexing

我主要使用这三个表在MySQL中实现了倒排索引:

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

其中word_idINTdoc_idBIGINT

然后,我尝试将WORDS和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个字符 - 所以从理论上讲,所占用的空间应该增加一倍以上。

2 个答案:

答案 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个字节。这种尺寸差异看起来是正确的。