繁体   English   中英

改善MySQL中的count()性能

[英]improving the count() performance in MySQL

我有一个如下的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)创建了一个复合索引。 请注意,我的查询是计算indexVal在“搜索”中出现了多少次,而不是在“表”中出现了多少次。

我的表有3列,有2800万条记录,将来的表将有数十亿条记录。 我正在使用InndoDB,我只是选择了它。 下面是我的表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

我用Explain命令运行了上面的select查询。 以下是结果

在此处输入图片说明

那么我怎样才能加快速度呢? 我希望在1秒以内得到结果。 感谢您的建议。

PS:我不需要结果按任何顺序排列。

尝试使用具有相反顺序的列的索引:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM