我有这张桌子:
CREATE TABLE `mytable` (
`date` date NOT NULL,
`parameters` mediumint(8) unsigned NOT NULL,
`num` tinyint(3) unsigned NOT NULL,
`val1` int(11) NOT NULL,
`val2` int(10) NOT NULL,
`active` tinyint(3) unsigned NOT NULL,
`ref` int(10) unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`ref`) USING BTREE,
KEY `parameters` (`parameters`)
) ENGINE=MyISAM AUTO_INCREMENT=79092001 DEFAULT CHARSET=latin1
有 1170 个不同的“日期”,大约 67000 个不同的“参数”,每一对(日期,参数)都是唯一的。
我正在尝试加快一个简单的选择:
SELECT parameters, sum(val1) from mytable where parameters=(one random value)
我已经索引了“参数”。请求大约需要 8 秒才能返回。
我测试了“myisamchk --sort-records”以根据我的“参数”索引对记录进行排序。
结果一开始看起来很棒,请求在 0.0x 秒内运行。
但是,当检查结果值是否正确时,我意识到有一个大问题,在
SELECT parameters, sum(val1) from mytable where parameters=10
我得到的结果是:
parameters= 10522 (!!!)
sum(val1)= 0
对于请求中所有不同的参数值也是如此,结果返回的参数字段根本不对应......
我不明白会发生什么。
更多信息:我试过了,它返回了正确的参数(在这种情况下=10)
SELECT val1 from mytable IGNORE INDEX(parameters) WHERE parameters=10;
这让我觉得索引搞砸了。在对行进行排序后,我还没有阅读任何有关重新索引的内容,但这可能是有道理的。它在任何地方都有记录吗?
我随后删除了索引并重新创建它,它解决了问题,但它没有解释它。另外,我的请求现在花费的时间和以前一样多(最多 8 秒),有没有办法让 myisamchk 数据排序按照我的预期工作,并带来相关的速度提升?