在 MySQL 数据库中存储股票价格

Storing stock prices in MySQL Database

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

这是我用来构建 tables 的创建语句的示例。

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;

最常见的查询是为两个日期之间的特定交易品种选择行。例如,这个 table 现在大约有 500,000 行,并且最多需要 8 秒才能 return 两年范围内的特定符号的大约 400 行。为什么需要这么长时间? Yahoo Finance 等网站如何如此快速地加载图表? 我一直在考虑将每只股票的数据存储在文件系统中自己的文件中,谁能提供一些关于这种方法的见解?如果这种方式足够快,我什至不需要限制行数 returned,我可以简单地 return 文件中的每一行。 CSV 会是 suitable 文件格式吗?

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

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

当索引的固定部分时,索引效果最好,symbol 在范围搜索部分之前,date

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

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

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

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

您可能希望所有列都 NOT NULL

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

使用 InnoDB。时期。句号。

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