奇怪的MySQL表大小

我主要使用以下三个表在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)

其中word现在为VARCHAR(50),doc_id为BIGINT

表INSTANCES和INSTANCES_NEW都具有word_id / word和doc_id的两个索引.对于相同的数据,INSTANCES显示为占用146MB,而INSTANCES_NEW显示为占用122.7MB. INT如何比VARCHAR(50)占用更多空间?几乎所有单词都至少包含3个字符-因此,理论上占用的空间应增加一倍以上.

解决方法:

不知道您的数据很困难,但是索引的大小可能有所不同.如您所说,这些表具有不同的索引…对于第一个表,您在word_id / word上具有索引,对于第二个表,您具有word / doc_id.因此,索引具有不同数量的条目,并且很可能具有不同的大小.您可以执行SHOW TABLE STATUS以获得更好的主意(可能将其发布在此处,以便我们可以一起对其进行分析).

编辑:
因此,您的结果是:

实例

总行数:1348741

平均行长:40B

数据:52.57MB

索引:93.20MB

总计:145.77MB

instance_new

总行数:1383266

平均行长:42B

数据:56.57MB

索引:66.14MB

总计:122.71MB

如您所见,实例表的索引(99.2MB)比第二种情况下的索引(66.14MB)大得多,而数据的大小几乎相同.因此,正如我想的那样,大小的差异来自索引大小,而数据大小的这种小差异可以用行数(大约)的小差异来解释.

上一篇:php-MySQL命令删除表的所有非主索引


下一篇:列顺序在mysql中重要吗?