我有一个像下面这样的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
查询。以下是结果
那么我怎样才能加快这个速度呢?我更喜欢在不到1秒的时间内获得结果。我感谢你的建议。
PS:我不需要结果是任何顺序。
答案 0 :(得分:0)
尝试使用反向列列的索引:
create index xx on key_word( `indexVal`,`hashed_word`);
这可能有助于防止优化程序使用filesort,
但我认为这不会有助于将查询速度提高500%,从5秒到不到1秒
您可能需要更快的硬件。