具有相同数据的两个MYSQL表具有不同的大小

时间:2015-02-06 07:09:40

标签: mysql

请查看以下'测试'表结构,它有5566行。 test_table_structure
请查看以下查询的详细说明:

select * from test where sig_date='2014-03-15' and symbol='AXP' order by score;

test_table_explain
我创建了具有不同名称和复合PRIMARY KEY的相同结构表,并插入了存在于' test'中的相同数据。表。 test_com_indx_strcture
现在解释了查询,它只选择了9条记录:

select * from test_com_indx where sig_date='2014-03-15' and symbol='AXP' order by score;

test_with_composite_index
当我检查2个表大小时,test_com_indx占用更多空间,两个表都有相同的数据。 table_space_details
我的信念是,'测试' table有PRIMARY KEY作为id,数据以id的顺序存储。 并且在' test_com_indx'表,数据按照复合PRIMARY KEY的顺序存储。因此,两个表都没有单独的索引副本 并且两个表应该具有相同的大小。

如果我的假设错了,为什么两张桌子都有不同的尺寸,请纠正我?

提前致谢。

1 个答案:

答案 0 :(得分:1)

进行一些阅读,information_schema.TABLES的结果可能与现实不同步,这可以解释为什么你的TABLE_ROWS不同。运行ANALYZE TABLE test, test_com_indx可能会使它们同步。

如果之后大小保持不同,我或者错误地解析问题,或者因为模式中存在这些差异而错误。

  • test_com_indx正在使用VARCHAR(10),测试有VARCHAR(25)
  • test有一个额外的INTEGER id列,必须跟踪AUTOCOMMIT。
  • test_com_indx有一个复杂的主键。

或/和它因为无保证关于内部如何工作,即使你做了两次完全相同的事情。 SQL数据库是声明性的,您不应该知道它如何回答您的查询,从而释放服务器以执行最有效的操作。造成这种情况的原因有很多......

  • INSERT的顺序可以改变数据的存储方式。
  • 索引可以更改数据的存储方式。
  • InnoDB does not store one table per file。它们都混合在一个表空间中。一个表中的更改可以改变另一个表的内部存储。