实施用于组织历史库存数据的数据库模式

Implement database schema for organizing historical stock data

我是 MySQL 的新手,我尝试使用 MySQL 来存储我的股票数据。

我按照boe100在参考中的回答:

我按如下方式创建 table:

mysql> 描述 StockDailyQuotations;

Field Type Null Key Default Extra
ts_code varchar(9) NO PRI NULL
trade_date int(8) NO PRI NULL
open decimal(6,2) NO NULL
high decimal(6,2) NO NULL
low decimal(6,2) NO NULL
close decimal(6,2) NO NULL
change decimal(6,2) YES NULL
pct_chg float YES NULL
vol float YES NULL
amount float YES NULL

10 rows in set (0.00 sec)

我总是通过以下两种方式使用 table:

(1)查询一只股票的历史数据,耗时0.01秒

SELECT * FROM StockDailyQuotations WHERE ts_code='000001.SZ';

(2) 一天内搜索所有股票的数据。耗时1.94秒。

SELECT * FROM StockDailyQuotations WHERE trade_date='20201231';

参考资料中的答案说:“我们在符号、日期和时间列上也有一个聚集索引。 我们可以在几毫秒内从服务器中获取数据。请记住,数据库大小几乎是 1 TB。”但就我而言,搜索 1 已经足够快,我想加速类型 2 搜索。

我认为 ts_code 和 trade_date 上的主键已经成为聚簇索引。 我误解了什么吗?如何加速搜索(2)?

如果这是一个愚蠢的问题,我深表歉意。感谢您的宝贵时间。

我为 'trade_date' 创建了一个索引,搜索方式 (2) 可以与方式 (1) 具有相同的性能。

(不是“傻问题”,只是“菜鸟问题”)

PRIMARY KEY(ts_code, trade_date)
INDEX(trade_date)

但是有trade_date DATE(没有INT

DECIMAL(6,2)限制你为9999.99;可以吗?

使用ENGINE=InnoDB

注意其他未标记 [mysql] 或 [mariadb] 的问题;他们可能有不利于 MySQL.

的语法和其他建议

如果包括“时间”,最好使用单个 DATETIME 列,而不是两列(DATETIME)。但是,这会在请求给定日期的信息时导致一些棘手的业务。