【问题标题】:Implement database schema for organizing historical stock data实施用于组织历史股票数据的数据库模式
【发布时间】:2021-12-14 12:27:45
【问题描述】:

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

我按照boe100 的回答作为参考:

我按如下方式创建表:

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)

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

(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)?

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

【问题讨论】:

  • 什么是amount
  • 而vol是存货数量?
  • 对不起,amountStock turnovervolStock trading volume。一个计算价格的总和,一个计算交易的总和。
  • 先生,您是否建议使用int来存储amountvol
  • FLOAT 如果其限制为大约 7 个 重要 位是可以的。

标签: mysql sql schema stock


【解决方案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)。但是,在请求给定日期的信息时,这会导致一些棘手的问题。

【讨论】:

  • 先生,我的日期只包含年、月、日,如20211001表示Oct-01-2020。 int 够用吗?
  • 不要尝试在这样的 INT 中添加“一天”。使用 DATE,您可以执行 + INTERVAL 1 DAY
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2010-12-04
    • 1970-01-01
    • 2014-04-05
    • 2023-03-10
    • 2014-09-25
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    相关资源
    最近更新 更多