Mysql

提高 MySQL 儲存股票價格表的讀取速度(1 億條條目)

  • March 19, 2020

我有一個表,它將股票價格儲存在具有以下結構的 MySQL 數據庫中:

CREATE TABLE IF NOT EXISTS `tbl_prices` (
 `price_id` bigint(20) NOT NULL AUTO_INCREMENT,
 `stock_id` int(11) NOT NULL,
 `datasource_id` int(11) NOT NULL,
 `price_time` bigint(20) NOT NULL,
 `price_time_frame` bigint(20) NOT NULL,
 `price_open` double NOT NULL,
 `price_close` double NOT NULL,
 `price_low` double NOT NULL,
 `price_high` double NOT NULL,
 `price_volume` double NOT NULL,
 PRIMARY KEY (`price_id`),
 UNIQUE KEY `unique_entry` (`stock_id`,`datasource_id`,`price_time`,`price_time_frame`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=0 ;

該表主要用作儲存,這意味著每個股票和時間範圍的所有數據都會在應用程序啟動時載入到記憶體中。新股票價格不斷寫入數據庫。

載入給定股票所有價格的常見查詢如下所示:

SELECT price_open, price_high, price_low, price_close, price_volume, price_time 
FROM tbl_prices
WHERE stock_id=1 AND datasource_id=2 AND price_time_frame=864000
ORDER BY price_time;

解釋:

EXPLAIN SELECT price_open, price_high, price_low, price_close, price_volume, price_time 
FROM tbl_prices
WHERE stock_id=1 AND datasource_id=2 AND price_time_frame=864000
ORDER BY price_time;

結果是:

id  select_type     table   type    possible_keys   key     key_len     ref     rows    Extra   
1   SIMPLE  tbl_prices  range   unique_entry    unique_entry    24  NULL    113036  Using index condition

該表包含超過 1 億個條目。

一切正常,但從表中載入價格會花費大量時間。我怎樣才能加快表架構?

問候,

這並不能回答整個問題,但作為第一個提示,我建議更改唯一鍵定義中列的順序,從:

`unique_entry` (`stock_id`, `datasource_id`, `price_time`, `price_time_frame`)

到:

`unique_entry` (`stock_id`, `datasource_id`, `price_time_frame`, `price_time`)

where這首先將所有在謂詞中起作用的列,然後是排序列,因此這使數據庫有更好的機會充分利用索引。

另外:你真的需要select *嗎?您獲得的列越多,數據庫必須處理(和返回)的有效負載就越大。您應該列舉您真正想要的列。理想情況下,您將只提取屬於索引的列:這使得索引覆蓋查詢,並且數據庫可能能夠通過僅查看索引來執行整個查詢。

作為系統管理員,我建議:

  • stock_id對, datasource_id,使用索引price_time_frame(在哪里或按列排序)
  • 在 HDD 上使用固態驅動器(單個 7200 RPM 驅動器限制為 200 I/O,企業 SSD 磁碟限制為 50,000 I/O)
  • 編輯 Mysql 伺服器設置,如:innodb_buffer_pool_sizeinnodb_io_capacity 表模式、伺服器設置和硬體之間的這種組合將為您提供非常好的性能

引用自:https://dba.stackexchange.com/questions/261446