在2亿行表上优化mysql查询

时间:2014-12-11 18:59:59

标签: mysql optimization dataset bigdata

我有一个mysql数据库,带有一个表,obs,大约有2亿行。有一个列,concept_id,它是观察的代码。例如,权重的concept_id是6012.我需要使用多个概念来报告几个指标。总共有大约20个感兴趣的概念。当我查询表格时,我会这样做:

select * from obs where concept_id in     (1285,1596,2051,1061,8307,8282,5356,1224,1251,1252,5089,5090,1570,1109,1261,6174,1110,1265,1111,1268,1270,5272,1836,1279,1855,5596,1146,1088,1255,1250,1252,1499,2158)

我将此结果集加载到非规范化的临时表中,使每个概念成为一列,然后进行一些分析。

问题是需要很长时间才能完成初始选择语句 - 几十分钟。鉴于这个表的大小(不是那么大),从我的阅读来看,如果表格得到适当优化,这似乎应该更快(秒)。

obs表由概念id索引。以下是解释的结果:

id  select_type table   type    possible_keys   key key_len ref rows    Extra
1   SIMPLE  obs range   obs_concept,obs_complex_cvCpvoD_idx,obs_complex_cpvvD_idx   obs_complex_cvCpvoD_idx 4   NULL    19584   Using where; Using index

在我的my.cnf设置中,我有以下内容:

key_buffer              = 2GB
max_allowed_packet      = 512M
thread_stack            = 512K
thread_cache_size       = 16
query_cache_limit       = 1M
query_cache_size        = 16M
default-storage-engine = innoDB
innodb_file_per_table = 1
innodb_file_format = barracuda
innodb_strict_mode = 1
innodb_file_per_table
innodb_log_buffer_size                  = 32MB
innodb_buffer_pool_size                 = 16GB
innodb_additional_mem_pool_size         = 10M

非常感谢任何有关优化此设置/查询的建议。

更新:返回的总行数约为3000万。使用in运行大约需要20分钟。如果我单独执行每个查询,则大约需要10分钟。

0 个答案:

没有答案