在 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 中。
我正在创建一个网站,该网站根据历史每日股票报价进行计算。现在我有 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 中。