鍍金池/ 問答/數(shù)據(jù)庫/ 查詢優(yōu)化的一個問題

查詢優(yōu)化的一個問題

我有一個表exchange

CREATE TABLE `exchange` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `rank` int(11) NOT NULL,
  `name` varchar(255) NOT NULL,
  `volume` varchar(255) NOT NULL,
  `timestamp` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=75032 DEFAULT CHARSET=utf8;

每5分鐘,會記錄一記數(shù)據(jù),每次209條左右,是當(dāng)前時間209個數(shù)字貨幣交易所的成交量。

我期望可以查到這樣的數(shù)據(jù):

rank name [volume(最新的144個值)] timestamp

我現(xiàn)在采用的笨辦法是,一個個交易所去查,
得到交易所列表
一個個查
select volume from exchange where exchange.name='binance' order by timestamp DESC limit 144

性能開銷很大,想請教下,有沒有更好的方法?

回答
編輯回答
奧特蛋

我有一個想法,不知道是否可行。exchange的結(jié)構(gòu)不改動,新建一張表

CREATE TABLE `exchange_statistics` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `volume_statistics` text NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

其中volume_statistics字段記錄的是通過數(shù)組序列化或者符號分割后的最新的144個值,144個值可以是從小到大或者按時間整理好,然后每隔5分鐘最前的元素剔除,從后面加入最新的元素。

這樣每個交易所預(yù)處理好最新的144個值,獲取交易所列表直接查詢exchange_statistics即可。

exchange結(jié)構(gòu)不需要改動,防止以后業(yè)務(wù)改動,有涉及統(tǒng)計的功能。

這種方案不知如何?

2017年11月19日 16:21
編輯回答
念初

數(shù)據(jù)量沒有超過200萬,你這個查詢速度在300ms左右,如果開啟了緩存,會更快,如果你數(shù)據(jù)量超過200萬,timestamp加索引,速度也非??捎^,不知道你的數(shù)據(jù)量如何

2017年9月28日 11:40