我有一个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分钟。