2

我有这张桌子:

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 数据排序按照我的预期工作,并带来相关的速度提升?

4

1 回答 1

2

再跑myisamchk --sort-records。之后运行 a CHECK TABLE mytable,看看它告诉你什么。MyISAM 不是很稳定,因此如果在排序过程中出现故障,索引可能会被搞砸。

如果索引损坏,这应该显示并且您可以运行REPAIR TABLE mytable. 这将修复索引。看看你的查询是又慢了还是现在更快了。

如果这一切都没有帮助,您还有更多选择:

  1. 如果可能,插入已按顺序排序的行parameters
  2. 创建分区: CREATE TABLE mytable( ... ) PARTITION BY HASH(parameters) PARTITIONS 10; 这也应该会大大增加查询时间。
于 2013-11-12T10:18:38.513 回答