首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mysql造型性能基准问题/数据架构

Mysql造型性能基准问题/数据架构
EN

Stack Overflow用户
提问于 2011-04-21 10:40:30
回答 1查看 1.2K关注 0票数 1

目前,我正在处理一个数据集,它只是一个redicolus;一个来自多个供应商的平面文件,没有韵律和原因;它大约有200列。这200个中有15个是常见的,我已经把它们拉到了另一个表中。

在其他185列中,它们是varchar、int的datetime和多个字符串值的混合。

现在,我正在尝试决定如何最好地存储其他185列;就像在扁平表中一样,目前证明它的伸缩性非常差。我有两个解决方案设置,但是我不知道哪一个更好。

一种是将每个列的元数据存储在单独的表中(如图所示)

但是,似乎使用这种方法会非常困难;如果以后我需要查询位于此处的项,则会非常困难。

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

代码语言:javascript
复制
 select * from foo where cast(col_to_query) as int < 5

然而,我不确定这样做时的性能如何。

问题:

这两种方法中哪一种性能更好,你会推荐哪一种(或者如果有更好的选择,我很想听听)。

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-04-21 10:50:33

第一种方法的伸缩性甚至比单个表更差,而且从查询到引导都非常困难。

我建议使用包含所有列的单个表作为开始方法。你说过它的伸缩性很差。您这是什么意思?它的伸缩性有多差?查询返回需要很长时间吗?您是否为您的查询正确地为表建立了索引?列数通常不会显著影响查询返回的时间,除非它们返回大量数据。如果是这样的话,如果所有的时间都花在mysql和客户端之间的数据传输上,那么在幕后存储数据的方式对查询响应时间几乎没有影响。在这种情况下,请确保只选择您关心的列。不要做"select *“。

另一种选择是使用表继承策略。在本例中,您将有一个存储15个常见属性的父表,以及一个根据记录所来自的文件来标识记录类型的“类型”,或者您也可以将其称为源。然后,为每个不同的文件创建一个1到0-1映射的扩展表,并仅为每个特定文件创建自定义列。这可能不会像一个大表那样执行得很好,因为您必须进行连接,但它将有助于减少对一个表上的一大堆列的需求,这些列通常为空。

这看起来像这样:

代码语言:javascript
复制
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),
  ...
);

按如下方式查询:

选择,,...from master inner join file1_data on file1_data.master_id = master.master_id where ...

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5738911

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档