我有这张桌子:
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:
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;
这让我觉得索引搞砸了。在排序行之后,我没有读过有关重新索引的任何内容,但它可能有意义。是在任何地方记录的吗?
我随后删除了索引并重新创建了它,它解决了问题,但它没有解释它。另外,我的请求现在花费的时间和之前一样多(最多8s),有没有办法让myisamchk按照我的意图对数据进行排序,以及相关的速度增益?
答案 0 :(得分:2)
再次运行myisamchk --sort-records
。之后运行CHECK TABLE mytable
并查看它告诉您的内容。 MyISAM不是很稳定,因此如果在排序过程中有一个hickup,索引可能会被提升。
如果索引已损坏,则应显示此消息,您可以运行REPAIR TABLE mytable
。这将修复索引。查看您的查询是否再次缓慢或现在是否更快。
如果这一切都无济于事,您还有其他选择:
parameters
CREATE TABLE mytable(
... )
PARTITION BY HASH(parameters)
PARTITIONS 10;
这也应该大大增加查询时间。