是否有更好的索引来加速此查询?

时间:2010-09-03 16:03:30

标签: mysql query-optimization

以下查询使用临时和filesort。如果可能的话,我想避免这种情况。

SELECT lib_name, description, count(seq_id), floor(avg(size)) 
FROM libraries l JOIN sequence s ON (l.lib_id=s.lib_id)
WHERE s.is_contig=0 and foreign_seqs=0 GROUP BY lib_name;

EXPLAIN说:

id,select_type,table,type,possible_keys,key,key_len,ref,rows,Extra
1,SIMPLE,s,ref,libseq,contigs,contigs,4,const,28447,Using temporary; Using filesort
1,SIMPLE,l,eq_ref,PRIMARY,PRIMARY,4,s.lib_id,1,Using where

表格如下:

文库

CREATE TABLE  `libraries` (
  `lib_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `lib_name` varchar(30) NOT NULL,
  `method_id` int(10) unsigned DEFAULT NULL,
  `lib_efficiency` decimal(4,2) unsigned DEFAULT NULL,
  `insert_avg` decimal(5,2) DEFAULT NULL,
  `insert_high` decimal(5,2) DEFAULT NULL,
  `insert_low` decimal(5,2) DEFAULT NULL,
  `amtvector` decimal(4,2) unsigned DEFAULT NULL,
  `description` text,
  `foreign_seqs` tinyint(1) NOT NULL DEFAULT '0' COMMENT '1 means the sequences in this library are not ours',
  PRIMARY KEY (`lib_id`),
  UNIQUE KEY `lib_name` (`lib_name`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=latin1;

序列

CREATE TABLE  `sequence` (
  `seq_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `seq_name` varchar(40) NOT NULL DEFAULT '',
  `lib_id` int(10) unsigned DEFAULT NULL,
  `size` int(10) unsigned DEFAULT NULL,
  `add_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `sequencing_date` date DEFAULT '0000-00-00',
  `comment` text DEFAULT NULL,
  `is_contig` int(10) unsigned NOT NULL DEFAULT '0',
  `fasta_seq` longtext,
  `primer` varchar(15) DEFAULT NULL,
  `gc_count` int(10) DEFAULT NULL,
  PRIMARY KEY (`seq_id`),
  UNIQUE KEY `seq_name` (`seq_name`),
  UNIQUE KEY `libseq` (`lib_id`,`seq_id`),
  KEY `primer` (`primer`),
  KEY `sgitnoc` (`seq_name`,`is_contig`),
  KEY `contigs` (`is_contig`,`seq_name`) USING BTREE,
  CONSTRAINT `FK_sequence_1` FOREIGN KEY (`lib_id`) REFERENCES `libraries` (`lib_id`)
) ENGINE=InnoDB AUTO_INCREMENT=61508 DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC;

我可以做些什么来让查询变得更快?如果没有,那么(对于Web应用程序)是否值得将上述查询的结果放入MEMORY表中?

1 个答案:

答案 0 :(得分:1)

第一个策略:让mySQL更快地找到您想要汇总的记录。

你已经有了sequence.is_contig的索引。您可以尝试索引libraries.foreign_seqs。我不知道这是否会有所帮助,但值得一试。

第二个策略:看看你是否能够在内存中运行,而不是在文件中运行。尝试使sort_buffer_size参数更大。这将消耗服务器上的RAM,但这就是RAM的用途。

第三种策略:如果您的应用程序需要进行大量查询,但只更新基础数据,请自行提出建议并创建摘要表。也许使用EVENT重制摘要表,并每隔几分钟运行一次。如果您要遵循该策略,请首先在其中创建包含此表的视图,并让您的应用从视图中检索信息。然后获取摘要表内容,删除视图,并为摘要表提供与视图相同的名称。这样,您的数据模型工作和您的应用程序设计工作可以相互独立地进行。

最终建议:如果这是真正缓慢变化的摘要数据,请切换到myISAM。这种数据争论的速度要快一些。