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

标签 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;

这让我觉得索引搞乱了。我还没有读过任何有关对行进行排序后重新索引的内容,但这可能是有道理的。它在任何地方都有记录吗?


我随后删除了索引并重新创建了它,它解决了问题,但没有解释它。另外,我的请求现在花费的时间和以前一样多(最多 8 秒),有没有办法让 myisamchk 数据排序按照我的预期方式工作,并提高速度?

最佳答案

运行myisamchk --sort-records再次。之后运行 CHECK TABLE mytable看看它告诉你什么。 MyISAM 不是很稳定,所以如果排序过程中出现卡顿,索引可能会搞砸。

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

如果这一切都没有帮助,您还有其他几个选择:

  1. 如果可能,插入已按 parameters 排序的行
  2. 创建分区: CREATE TABLE mytable( ... ) PARTITION BY HASH(parameters) PARTITIONS 10; 这也会大大增加查询时间。

关于mysql - 运行 myisamchk --sort-records 后无意义的 SELECT 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19803335/

相关文章:

mysql - 计数函数返回零 - Mysql

SQL:根据 postgresql 中的字段返回忽略重复项的所有记录

mysql - 选择特定数据库进行 mysql gtid 复制

mysql - 简单 InnoDB 表上的简单 MySQL INSERT 查询需要 40+ms

MySql 左加入几个 regs

sql - MySQL 多对多查询问题

Mysql显示数据库按创建日期排序?

java - 如何将 php 变量返回给 android 应用程序?

mysql - 使用子查询和内连接插入

mysql - 在备份文件中将 InnoDB 更改为 MyIsam 好吗?