【问题标题】:Storing stock prices in MySQL Database在 MySQL 数据库中存储股票价格
【发布时间】:2021-11-15 11:41:36
【问题描述】:

我正在创建一个基于历史每日股票报价进行计算的网站。现在我有 5 个表对应于字母表中的不同字母(按符号组织)。

这是我用于构建表的 create 语句的示例。

CREATE TABLE `EOD_QRSTU` (
  `symbol` varchar(10) NOT NULL,
  `open` decimal(10,5) DEFAULT NULL,
  `close` decimal(10,5) DEFAULT NULL,
  `high` decimal(10,5) DEFAULT NULL,
  `low` decimal(10,5) DEFAULT NULL,
  `volume` int(11) DEFAULT NULL,
  `date` datetime NOT NULL,
  PRIMARY KEY (`date`,`symbol`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

最常见的查询是为两个日期之间的特定符号选择行。例如,这个表现在有大约 500,000 行,并且需要长达 8 秒的时间来为两年范围内的特定符号返回大约 400 行。为什么需要这么长时间?雅虎财经等网站如何快速加载图表? 我一直在考虑将每只股票的数据存储在文件系统中自己的文件中,任何人都可以对这种方法提供一些见解吗?如果这种方式足够快,我什至不需要限制返回的行数,我可以简单地返回文件中的每一行。 CSV 会是合适的文件格式吗?

如果重要的话,我现在正在使用 PythonAnywhere 来托管网站,并且正在使用带有 Flask-SQLalchemy 的 Python 作为后端。我也计划很快迁移到 AWS,这会解决部分问题吗?

【问题讨论】:

  • 数据库通常比文件系统快得多
  • @RiggsFolly 我已经将它作为主键索引?
  • 使用explain 了解查询在做什么。如果它很好地使用索引,那么您将处于内存中可以容纳的极限。关系数据库在可扩展性方面从根本上受到限制,但是像您描述的 500k 行应该在适度系统的限制范围内。你的mysql服务器的内存设置够吗?

标签: mysql database-design


【解决方案1】:

重新排列您的主键并将symbol 放在date 之前。

当索引的固定部分 symbol 位于范围搜索部分 date 之前时,索引效果最佳。

通过查看explain {query} 并查看使用了多少字节的索引和查询计划来检查这一点。

如果您只使用ascii 字符集,也不要使用symbol UTF8。

【讨论】:

【解决方案2】:

我同意danblack的回答(PK列顺序,字符集)

DECIMAL(10,5) 对于 BRK.A 来说不够大,目前为 412,802 美元。 INT 对于几个索引的volume 来说不够大。

您可能希望在所有列上都显示NOT NULL

不同的文件系统可能没有足够的帮助。

使用 InnoDB。时期。句号。

你有多少内存? innodb_buffer_pool_size 的值是多少?你有HDD还是ssd?听起来您的表远小于 1GB,所以我希望大部分时间都将内容完全缓存在 RAM 中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多