Skip to content
Advertisement

Implement database schema for organizing historical stock data

I am new to MySQL, I try to use MySQL to store my stock data.

I followed the answer by boe100 in reference:

I create my table as follows:

mysql> describe 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)

I always use the table in two following ways:

(1) search one stock’s history data, It takes 0.01 seconds.

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

(2) search all stock’s data in one day. It takes 1.94 seconds.

SELECT * FROM StockDailyQuotations WHERE trade_date='20201231';

The answer in reference said: “We also have a clustered index on symbol, date and time columns. We can get data out of the server in a matter of milliseconds. Remember, the database size is almost 1 terabyte.” But in my case, searching 1 is fast enough, I want to accelerate type 2 searching.

I think the primary key on ts_code and trade_date is already made the clustered index. Do I misunderstand anything? How can I accelerate the searching (2)?

I apologize if it is a stupid problem. Thanks for your time.

Advertisement

Answer

(It’s not a “stupid problem”, just a “novice question”.)

PRIMARY KEY(ts_code, trade_date)
INDEX(trade_date)

But have trade_date DATE (not INT)

DECIMAL(6,2) limits you to 9999.99; is that OK?

Use ENGINE=InnoDB

Be cautious of other Questions that are not tagged [mysql] or [mariadb]; they are likely to have syntax and other suggestions that are not good for MySQL.

If you include “time”, it is probably better to use a single DATETIME column, not two columns (DATE and TIME). However, this leads to some tricky business when requesting info for a given date.

User contributions licensed under: CC BY-SA
5 People found this is helpful
Advertisement