Mysql Casting性能基准测试问题/数据架构

时间:2011-04-21 02:40:30

标签: mysql performance architecture

目前我正在处理一个只是redicolus的数据集;来自多个供应商的平面文件,没有任何押韵或理由;并且坐在大约200列。在这200个之间共有15个,我把它拉到另一个表中。

在其他185列中,它们混合了varchar,int的日期时间和多个字符串值。

现在我正在尝试决定如何最好地存储这185个其他列;就像在目前的平台上一样,它只是证明了超级规模。我有两个解决方案设置,但我不知道哪个更好。

一个是将每个列的元数据存储在不同的表中(见图)Image architecture

然而似乎使用这种方法;如果在路上我需要对这里的物品进行查询,那将是非常困难的。

我想到的另一种方法是将所有列放入一个具有id,value,datatype的表中,而不是在执行查询时将值转换为数据类型,即:

 select * from foo where cast(col_to_query) as int < 5

然而,我不确定这样做时的表现是什么样的。

问题:

这两种方法中的哪一种会更好地表现出来,哪一种你会推荐(或者如果有更好的选择,我很乐意听到它)。

谢谢

1 个答案:

答案 0 :(得分:3)

第一种方法的扩展性甚至比单个表更差,查询引导将非常困难。

我建议使用单个表,其中包含所有列,作为开始方法。你说它虽然规模很小。你是什​​么意思?怎么缩小得很差?查询需要很长时间才能返回吗?您是否已正确索引表格以查询?除了返回大量数据之外,列数通常不会影响查询显着返回的时间。如果是这种情况,如果在mysql和客户端之间传输数据时花费了所有时间,那么如何将它存储在封面下对查询响应时间几乎没有影响。如果是这种情况,请确保您只选择您关心的列。不要“选择*”。

另一种选择是使用表继承策略。在这种情况下,您将拥有一个存储15个公共属性的父表,以及一个基于文件来源标识记录类型的“类型”,或者您可以将其称为源。然后,为每个不同的文件创建一个扩展表,其中包含每个特定文件的自定义列的1到0-1映射。这不会像一个大表一样好,因为你必须做连接,但它将有助于减少一个表上通常为空的一大堆列的需要。

这看起来像这样:

create table master (
  master_id int not null auto_increment primary key,
  type int,
  <field1> int,
  <field2> varchar(20),
  ...
);

create table file1_data (
  master_id int not null primary key,
  type int,
  <field16> int,
  <field17> varchar(20),
  ...
);

像这样查询:

选择,, ... 来自大师 内连接file1_data 在file1_data.master_id = master.master_id 哪里......