【发布时间】:2014-04-27 08:09:40
【问题描述】:
我有一个如下所示的 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:我不需要按任何顺序排列结果。
【问题讨论】:
-
在您之前的问题中,
hashed_word IN出现在哪里,但是在这个问题中出现在WHERE indexVal上。现在对于索引,您已经组合了索引,它将始终寻找最左边的前缀并且您有KEY hashed_word (hashed_word,indexVal)所以它不采用索引 -
@AbhikChakraborty:感谢您的关注。我用正确的查询更新了问题。
-
@AbhikChakraborty:
MyIsamstorage 可以帮我吗? -
你有很多记录,所以看看如何解决它。
-
@AbhikChakraborty:谢谢。像 MS SQL Server 这样的付费系统能帮到我吗?
标签: mysql sql performance count innodb