在MySQL中将大表拆分成几个表,还是坚持使用一个表是否更有效?

时间:2015-08-22 14:59:43

标签: mysql database-design

我正在编写一个C#程序,我正在查看~5300个股票行情。我将数据存储在MySQL数据库中,其中包含以下字段:date,tickername,closingPrice,movingaverage50,movingaverage200,...以及其他一些字段。每个库存最多可包含15300个不同的数据点。所以总数据库将是5300x15300x6左右不同的字段。

我的问题是,除了一个大表外,是否有更有效的方法来存储所有这些数据?将数据分解成不同的表格,比如十年,会给我买点东西吗?是否有一些链接/网站我应该去了解我应该考虑哪些因素来设计数据库尽可能快,或者MySQL数据库本身是否有效?

我目前正在读取5500个excel文件,一次一个地用数据填充我的c#对象,这需要大约15分钟......我假设一旦我让MySQL继续下去就会被削减。< / p>

感谢您的帮助;对于一个开始考虑数据库设计的地方来说,这更像是一种捕鱼方式。

2 个答案:

答案 0 :(得分:0)

评论太长了。

通常,以相同格式存储多个表是一个坏主意。这成为一个维护问题,并对某些类型的查询产生可怕的后果。因此,首选一个表。

总行数为486,540,000。这非常大,但不是非凡。

关于数据布局的问题不仅取决于数据,还取决于数据的使用方式。我的猜测是使用索引和分区可以解决您的性能问题。

在15分钟内处理5,500个Excel文件似乎相当不错。数据库是否会明显更快取决于服务器和应用程序之间的数据量。如果您将“Excel”文件作为CSV文本文件阅读,那么数据库可能不是一个很大的收获。如果您正在阅读Excel,那么可能会更好。

注意:使用数据库,您可以将处理从C#移动到数据库中。这允许数据库利用并行处理,这可以为性能改进开辟其他途径。

答案 1 :(得分:0)

  • 一张桌子。
  • PRIMARY KEY(ticker, date) - 这样可以获得有关单个自动收报机的历史信息,因为它有效。
  • PARTITION BY (TO_DAYS(date)) - 这导致所有INSERT活动都在一个分区中。这个分区的大小是有限的,因此每晚分散插入5300个新行的随机访问可能仍然在缓存中。
  • 按月分区,或大约相当大的内容 - 足够小,可以缓存分区,但不能太小,以至于您的分区数量很大。 (将表格保持在50个分区之下是很好的。这个“限制”可能会随着5.7中的“原生分区”而提升。)
  • 如果已经在表格中有几个月的数据,请将其放在一个超大的分区中;按月分割是没有优势的。
  • 最小化列大小。 SMALLINT UNSIGNED的2字节ticker_id,链接到代码的规范化表。 3字节DATE;对于INT UNSIGNED,音量可能太大,要么使用FLOAT(有一些舍入错误),要么使用DECIMAL。价格很棘手 - 使用FLOAT舍入错误,使用DECIMAL过大:美国代码需要至少(9,4)(5个字节),如果你回到分数定价的日子会更糟(例如,5-9 / 16 )。
  • 考虑移动平均线的计算;这可能是最密集的活动。