对于未来的市场数据,我们每天至少需要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"
任何建议如何加快选择性能?谢谢!
答案 0 :(得分:0)
要定制到SELECT
,请创建表InnoDB并设置群集PRIMARY KEY
,以便所需的行是连续的。这可能会减慢INSERT
进程的速度,但这不是问题 - 12个插入/秒很容易处理。
但是让我离题一下 - 1M行是否同时进入?或者是在7个多小时内涓涓细流?或者是什么?如果一次全部,则在执行大量LOAD DATA
之前根据PK对数据进行排序。
您的查询需要PRIMARY KEY(instrument, time)
。但PK必须是“独一无二的”;那是独特的吗?如果没有,那么应该将另一列(id
?)`添加到最后以使其唯一。
请注意,如果它是唯一的,那么您不需要AUTO_INCREMENT
;摆脱它。对于如此大的表,最小化索引的数量是至关重要的,不仅仅是为了性能,而是为了能够生存。
其他待办事项......
SMALLINT UNSIGNED
(2个字节)。有关在您摄取时进行规范化的更多讨论,请参阅my blog。FLOAT
(4个字节)很有诱惑力,但它有四舍五入的错误。 DECIMAL
是棘手的,因为你需要担心一个极端的便士股票和另一个极端的BRK-A。innodb_buffer_pool_size
设置为可用 RAM的约70%(假设您的RAM超过4GB)。id
保留为AUTO_INCREMENT
,请添加INDEX(id)
;这就是保持A_I快乐所需的一切。CHARACTER SET ascii
。Volume
在极少数情况下可超过40亿;思考该怎么做。FULLTEXT
对此应用程序无用。PARTITIONing
不太可能有用;如果您想分享其余的查询,我们可以重新访问它。另一方面,如果您要删除“旧”数据,那么PARTITIONing
是一个很好的主意。见my partition blog。