背景介绍
目前所有股票及期货的行情数据都存储在Mysql数据库里,数据引擎采用默认的InnoDB,日线数据采用单表从存储,分钟及Tick数据采用按日期分表存储,每行存储单个时间切片上的相关行情数据,数据库按日更新,通常仅发生15:30后的一段固定时间内,数据库查询则主要用于量化策略的回测,可能发生在任何时间段,目前需在不改变Mysql存储架构的前提下尽量优化查询效率,因股票与期货的行情在存储结构上基本一致,故仅讨论股票的情况(查询需求通常为查询单只或多只股票在N日的日线、分钟及Tick数据,股票代码列添加了普通索引)。
1、存储介质优化
首先考虑数据体量,分析能否用内存代替硬盘存储数据(目前服务器内存32G)。对于日线数据,因数据量本身较小,访问速度基本在秒级甚至以内可以完成,无太大必要进行优化;对于分钟数据,其数据量虽大但内存仍可容纳(不进行压缩的情况下股票单日50M,一年可达12.5G),因此可用内存代替进行缓存;对于Tick数据,由于其数据量过大(不进行压缩的情况下股票单日2G,半年就达250G),远超出内存的承受能力,故不在此方案考虑范围内;
1.1、利用临时表/内存表替代原始表
1)Mysql临时表的优势在于可以用同名临时表覆盖原始表,可无缝实现表的转换,并且不需要时也非常方便还原为原始表,但问题在于其仅针对创建会话可见,无法实现全局访问,因而放弃;
2)Mysql内存表可实现全局访问,但需单独建表, 同时,还需调整max_heap_table_size至适当水平。