运行myisamchk --sort-records后无意义的SELECT结果

时间:2013-11-06 03:05:27

标签: mysql sql myisam

我有这张桌子:

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按照我的意图对数据进行排序,以及相关的速度增益?

1 个答案:

答案 0 :(得分:2)

再次运行myisamchk --sort-records。之后运行CHECK TABLE mytable并查看它告诉您的内容。 MyISAM不是很稳定,因此如果在排序过程中有一个hickup,索引可能会被提升。

如果索引已损坏,则应显示此消息,您可以运行REPAIR TABLE mytable。这将修复索引。查看您的查询是否再次缓慢或现在是否更快。

如果这一切都无济于事,您还有其他选择:

  1. 如果可以,请插入已由parameters
  2. 订购的行
  3. 创建分区: CREATE TABLE mytable( ... ) PARTITION BY HASH(parameters) PARTITIONS 10; 这也应该大大增加查询时间。