查询优化的一个问题

我有一个表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分钟,会记录一记数据,每次209条左右,是当前时间209个数字货币交易所的成交量。

我期望可以查到这样的数据:

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

我现在采用的笨办法是,一个个交易所去查,
得到交易所列表
一个个查
select volume from exchange where exchange.name='binance' order by timestamp DESC limit 144

性能开销很大,想请教下,有没有更好的方法?

阅读 1.7k
2 个回答

我有一个想法,不知道是否可行。exchange的结构不改动,新建一张表

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字段记录的是通过数组序列化或者符号分割后的最新的144个值,144个值可以是从小到大或者按时间整理好,然后每隔5分钟最前的元素剔除,从后面加入最新的元素。

这样每个交易所预处理好最新的144个值,获取交易所列表直接查询exchange_statistics即可。

exchange结构不需要改动,防止以后业务改动,有涉及统计的功能。

这种方案不知如何?

数据量没有超过200万,你这个查询速度在300ms左右,如果开启了缓存,会更快,如果你数据量超过200万,timestamp加索引,速度也非常可观,不知道你的数据量如何

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题