我有一个表exchangeCREATETABLE`exchange`(`id`int(11)NOTNULLAUTO_INCREMENT,`rank`int(11)NOTNULL,`name`varchar(255)NOTNULL,`volume`varchar(255)NOTNULL,`timestamp`datetimeNOTNULL,PRIMARYKEY(`id`))ENGINE=InnoDBAUTO_INCREMENT=75032DEFAULTCHARSET=utf8;每5分钟,会记录一记数据,每次209条左右,是当前时间209个数字货币交易所的成交量。我期望可以查到这样的数据:rankname[volume(最新的144个值)]timestamp我现在采用的笨办法是,一个个交易所去查,得到交易所列表一个个查selectvolumefromexchangewhereexchange.name='binance'orderbytimestampDESClimit144性能开销很大,想请教下,有没有更好的方法?
2 回答
叮当猫咪
TA贡献1776条经验 获得超12个赞
我有一个想法,不知道是否可行。exchange的结构不改动,新建一张表CREATETABLE`exchange_statistics`(`id`int(11)NOTNULLAUTO_INCREMENT,`name`varchar(255)NOTNULL,`volume_statistics`textNOTNULL,PRIMARYKEY(`id`))ENGINE=InnoDBAUTO_INCREMENT=1DEFAULTCHARSET=utf8;其中volume_statistics字段记录的是通过数组序列化或者符号分割后的最新的144个值,144个值可以是从小到大或者按时间整理好,然后每隔5分钟最前的元素剔除,从后面加入最新的元素。这样每个交易所预处理好最新的144个值,获取交易所列表直接查询exchange_statistics即可。exchange结构不需要改动,防止以后业务改动,有涉及统计的功能。这种方案不知如何?
喵喔喔
TA贡献1735条经验 获得超5个赞
数据量没有超过200万,你这个查询速度在300ms左右,如果开启了缓存,会更快,如果你数据量超过200万,timestamp加索引,速度也非常可观,不知道你的数据量如何
添加回答
举报
0/150
提交
取消
