SQL表设置建议

时间:2010-04-14 13:45:28

标签: sql mysql optimization filter

基本上我有一个来自异地服务器的xml提要。

xml feed有一个参数?value = n现在N只能在1到30之间

我选择的任何值,XML文件总会返回4000行。我的脚本每天会为每个值调用此xml文件30次。那就是120000行。我将对这些行进行非常复杂的查询。但最重要的是我将始终按值进行过滤,以便SELECT * WHERE value = 'N'等等。总是会使用它。

现在最好有一个表存储所有120k行?或30个表是否存储了4k行?

编辑:有问题的SQL数据库将是MySQL

编辑:为了让它更清晰,数据将每天更新,因此旧表将被覆盖,我不想要任何存档解决方案,只是存储数据的最佳方式,以获得尽可能少的性能瓶颈尽可能地,输出的数据库结果将被缓存并每天更新。

编辑:我想我对自己的好处太过模糊了:(基本上,Feed是排行榜,每个值都是不同的排行榜位置

只有在排行榜位置发生变化且总是只有120k行时,才会更新这些值。不多也不少。

让我们说:

  1. 绿色
  2. 红色
  3. 当前的排行榜和Feed返回的下一次更新:

    1. 红色
    2. 绿色
    3. 只有第2行和第3行会发生变化。无论如何,这是我的计划:))

      另一个编辑>。<: 这些行最多只包含12列,每行少于1kb。而且更新只会在一天发生,因为源来自的服务器很慢,我的服务器需要80分钟才能从中获取所有Feed值。

6 个答案:

答案 0 :(得分:3)

在存储方面,120k行表和30个4k表之间几乎没有区别。

在维护方面,我总是选择一张桌子。它使您的代码和SQL更容易使用,并且由于您已经使用WHERE子句,我认为没有任何理由拆分表。

答案 1 :(得分:0)

只要您正确索引,一个表就会更快。你肯定需要一个关于你的值的索引(你应该称之为'value'是sql中的保留字)。

在您考虑的音量上,存储不应成为问题。如果您长期这样做,您可能需要调查旧数据的归档解决方案。

答案 2 :(得分:0)

单个表是我的首选。

我知道它不会包含单个导入的数据,而是包含WHERE子句的数据。

查询最初可能不会像您希望的那样快速恢复,您可以通过正确的索引解决问题。

更重要的是,如果由于某种原因你选择每天45次或每天90次或每5分钟一次(12 * 24 =每天288次),你会怎么做?创建288个表并更改与这些表相关的所有查询将是一项巨大的工作。

答案 3 :(得分:0)

你想要一张桌子。否则,您必须编写30个不同的查询,或构建动态查询解决方案(yuck)。

行有多宽?更重要的是,8k SQL页面上有多少行? (您可以根据它来估计您的磁盘I / O.)您的硬件需要多长时间才能读取这么多数据?或者它是否都适合内存,这样你就不会经常碰到磁盘了?我的观点是,你确实遇到了性能问题吗?

在表上放置一个复合聚簇索引,使得“n”值是第一列,这将优化这些读取(但前提是在WHERE子句中始终具有“n”值)。或者,如果“n”始终介于固定值1和30之间,并且您使用的是SQL 2005及更高版本,则可以实现表分区,这将为您提供相同的性能提升,并且可能会提供更多的灵活性。加载或卸载数据。

答案 4 :(得分:0)

正如所有其他人所说,请选择一张桌子。由于这一个表,数据库端不存在任何瓶颈性能,除非您的数据库已经设置不当,在这种情况下,这将揭示情况,而不是导致它。如果对涉及流中所有组件的详细信息(从用户启动请求到返回结果的时间)进行性能分析,您将看到在您的示例中数据库组件不会添加任何重要的性能损失。正如其他答案所指出的那样,您必须根据您的具体查询定义正确的索引。

答案 5 :(得分:0)

正如Oded所说,120K行没有真正的缩放/性能问题,所以我也会选择独特的表(为了简单起见)。

如果您将来需要扩展很多,请记住this article on "why SQL databases don't scale"。除此之外,文章解释了为什么“分区”(或“分片”)对SQL数据库不利:

  

Sharding会将您的数据划分为一些   特定于应用程序的边界。   例如,您可以存储用户   其名称以A-M开头   数据库和另一个N-Z。或者使用   用户id的模数由数字表示   数据库。

     

这需要深入整合   申请和精心策划   分区方案相对于   数据库架构和种类   您想要做的查询。总结:大   屁股疼痛。

     

因此,分片是一种形式   水平缩放,它失败了第2点:   它对业务不透明   应用程序的逻辑。

     

分片的更深层次问题是   SQL数据库是关系型的   数据库,以及大部分的价值   关系数据库是它存储的   关系。一旦你拆分记录   在多个服务器上,你是   服务于许多这些关系;   他们现在必须重建   客户方。 Sharding杀死最多   关系数据库的价值。

即使这最初被称为更多数据库之间的分区,也可以将相同的概念应用于您的案例,在这种情况下,您尝试实现某种“内部”分区。

结论,实际缩放的答案是NoSQL。再次,不是120K行:)