Mysql
提高 MySQL 儲存股票價格表的讀取速度(1 億條條目)
我有一個表,它將股票價格儲存在具有以下結構的 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_size
,innodb_io_capacity
表模式、伺服器設置和硬體之間的這種組合將為您提供非常好的性能