使用mariadb存储未来的市场数据(大量记录)

时间:2016-03-21 13:46:55

标签: mysql mariadb

对于未来的市场数据,我们每天至少需要1,000,000条记录,每条记录少了10个带有几个字母的文件。我选择了mariadb 5.5 on centos 7.引擎是innodb。 my.cnf有以下配置:

[server]
innodb_file_per_table=1
innodb_flush_log_at_trx_commit=2
innodb_buffer_pool_size=2G
innodb_log_file_size=256M
innodb_log_buffer_size=8M
bulk_insert_buffer_size=256M

当我插入记录时,它不是那么快,但它可以被接受。但是当我输出数据时,当innodb talbe大于某些GB时,它非常慢。 字段如:id,bid,ask,time,xx,xx,id是自动增量,并且是关键字。我的查询sql如下: select * from table where instrument =" xx"和时间> =" xx"和时间< =" xx"

任何建议如何加快选择性能?谢谢!

1 个答案:

答案 0 :(得分:0)

要定制到SELECT,请创建表InnoDB并设置群集PRIMARY KEY,以便所需的行是连续的。这可能会减慢INSERT进程的速度,但这不是问题 - 12个插入/秒很容易处理。

但是让我离题一下 - 1M行是否同时进入?或者是在7个多小时内涓涓细流?或者是什么?如果一次全部,则在执行大量LOAD DATA之前根据PK对数据进行排序。

您的查询需要PRIMARY KEY(instrument, time)。但PK必须是“独一无二的”;那是独特的吗?如果没有,那么应该将另一列(id?)`添加到最后以使其唯一。

请注意,如果它是唯一的,那么您不需要AUTO_INCREMENT;摆脱它。对于如此大的表,最小化索引的数量是至关重要的,不仅仅是为了性能,而是为了能够生存。

其他待办事项......

  • 规范化仪器。它有一个这样的表,并将其映射到一个id,如果低于65K,可能是SMALLINT UNSIGNED(2个字节)。有关在您摄取时进行规范化的更多讨论,请参阅my blog
  • 缩小您可以使用的任何字段 - FLOAT(4个字节)很有诱惑力,但它有四舍五入的错误。 DECIMAL是棘手的,因为你需要担心一个极端的便士股票和另一个极端的BRK-A。
  • 查看其余查询以确保PK中的此更改不会对他们造成伤害。
  • innodb_buffer_pool_size设置为可用 RAM的约70%(假设您的RAM超过4GB)。
  • 如果您必须将id保留为AUTO_INCREMENT,请添加INDEX(id);这就是保持A_I快乐所需的一切。
  • 除非您在某处需要utf8,否则请使用CHARACTER SET ascii
  • Volume在极少数情况下可超过40亿;思考该怎么做。
  • 以PK顺序获取10K行只需几秒钟。
  • FULLTEXT对此应用程序无用。
  • PARTITIONing不太可能有用;如果您想分享其余的查询,我们可以重新访问它。另一方面,如果您要删除“旧”数据,那么PARTITIONing是一个很好的主意。见my partition blog