我正在创建一个网站,根据历史的每日股票报价进行计算。现在,我有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;
最常见的查询是在两个日期之间为特定符号选择行。例如,这个表现在大约有50万行,需要8秒才能在两年的范围内返回特定符号的大约400行。为什么要花这么长时间?雅虎财经()这样的网站是如何如此迅速地载入它们的图表的?我一直在考虑将每只股票的数据存储在它自己的文件系统中,而不是,有人能对这种方法提供一些见解吗?如果这样速度足够快,我甚至不需要限制返回的行数,我可以简单地返回文件中的每一行。CSV是一种合适的文件格式吗?
如果重要的话,我现在使用PythonAnywhere托管站点,后端使用。我还计划很快迁移到AWS,这会解决部分问题吗?
发布于 2021-09-21 17:11:25
重新排序主键,并将symbol
放在date
之前。
当索引的固定部分( symbol
)位于搜索范围部分( date
)之前时,索引工作最好。
通过查看explain {query}
并查看使用了多少字节的索引和查询计划来检查这一点。
如果只使用symbol
字符集,也不要使用ascii
字符集。
发布于 2021-09-21 18:52:19
我同意丹布莱克的回答(PK列命令,字符集)
DECIMAL(10,5)
对BRK.A来说还不够大,目前为412,802美元。INT
不足以满足多个索引的volume
。
您可能希望在所有列上使用NOT NULL
。
一个不同的文件系统可能帮不了什么忙。
使用InnoDB。句号。句号。
你有多少内存?innodb_buffer_pool_size
的价值是什么?你有HDD还是ssd?听起来您的表比1GB少得多,所以我预计大部分时间都会在RAM中完全缓存。
https://stackoverflow.com/questions/69276880
复制相似问题