提高MySQL中的count()性能

时间:2014-04-27 08:09:40

标签: mysql sql performance count innodb

我有一个像下面这样的mysql查询。

   SELECT `indexVal`, COUNT(`indexVal`) 
   FROM `key_word` 
   WHERE `hashed_word` IN ('001','01v','0ji','0k9','0vc','0@v','0%d','13#' ,'148' ,
                           '1e1','1sx','1v$','1@c','1?b','1?k','226','2kl','2ue',
                           '2*l','2?4','36h','3au','3us','4d~') 
   GROUP BY `indexVal` 

此查询需要5秒钟才能生成结果!我甚至用ALTER TABLE key_word ADD INDEX (hashed_word, indexVal)创建了一个复合索引。请注意,我的查询是计算“{1}}在”搜索“中出现的次数,而不是”表格“中显示的次数。

我的表有3列,2800万条记录,未来的表将有数十亿条记录。我正在使用InndoDB,我刚选择它。以下是我的表indexVal结果

Show Create Table

我使用CREATE TABLE `key_word` ( `primary_key` bigint(20) NOT NULL AUTO_INCREMENT, `indexVal` int(11) NOT NULL, `hashed_word` char(3) NOT NULL, PRIMARY KEY (`primary_key`), KEY `hashed_word` (`hashed_word`,`indexVal`) ) ENGINE=InnoDB AUTO_INCREMENT=28570982 DEFAULT CHARSET=latin1 命令运行上述select查询。以下是结果

enter image description here

那么我怎样才能加快这个速度呢?我更喜欢在不到1秒的时间内获得结果。我感谢你的建议。

PS:我不需要结果是任何顺序。

1 个答案:

答案 0 :(得分:0)

尝试使用反向列列的索引:

create index xx on key_word( `indexVal`,`hashed_word`);

这可能有助于防止优化程序使用filesort,
但我认为这不会有助于将查询速度提高500%,从5秒到不到1秒 您可能需要更快的硬件。