3

我在其中一个 mySql 查询中有问题。问题在我们的任何本地机器上都无法重现。我有一个简单的查询

SELECT ID 
FROM TABLE_NAME 
WHERE ID IN (15920,15921) 
GROUP BY ID  

返回结果——

ID
15920

这是意外的结果,因为数据库中有两个 id 的数据。

使用 explain 命令返回此查询的以下结果

+----+-------------+------------+-------+--------- -----------+--------+---------+-----+- -----+----------------------------------------------------+
| 编号 | 选择类型 | 表| 类型 | 可能的键 | 钥匙 | key_len | 参考 | 行 | 额外 |
+----+-------------+------------+-------+--------- -----------+--------+---------+-----+- -----+----------------------------------------------------+
| 1 | 简单 | 表名 | 范围 | CUST_SID_SRUN_INDX | CUST_SID_SRUN_INDX | 4 | | 1 | 使用哪里;使用索引进行分组 |
+----+-------------+------------+-------+--------- -----------+--------+---------+-----+- -----+----------------------------------------------------+

对于这个问题,我尝试了以下解决方案 -

• 强制派生表 –

SELECT ID
FROM (SELECT ID 
      FROM TABLE_NAME 
      WHERE ID IN (15920,15921)) CUST 
GROUP BY ID

• 使用have 子句代替where 子句

SELECT ID 
FROM TABLE_NAME
GROUP BY ID 
HAVING ID IN (15920,15921)

• 忽略此表中使用的索引 –

SELECT ID 
FROM TABLE_NAME IGNORE INDEX (CUST_SID_SRUN_INDX)  
WHERE ID IN (15920,15921) 
GROUP BY ID

以上所有查询都返回预期结果如下:-

ID
15920
15921

我正在尝试分析使用索引时 group by 子句的意外行为。请让我知道我是否可以尝试其他方法。仅供参考……出现问题的 UAT 机器是一台装有 Mysql 5.1.30 的 linux 机器。我们看到的不同是Mysql的版本。我们在我们的机器上使用 Mysql 5.1.52。有这个问题的表使用 MyISAM 数据库引擎。

如果需要任何其他输入,请告诉我。

4

2 回答 2

1

谢谢大家的帮助。

MySql 5.1.30 中的 MyISAM 分区存在问题,经过几天的努力,我通过将 MySQL 升级到 5.1.52 版本或重新组织分区解决了这个问题。

供您参考,请参阅 MySQL 论坛上报告的以下错误:

http://bugs.mysql.com/bug.php?id=44821

于 2013-03-26T06:16:29.580 回答
0

如果您的查询结果使用索引时出错,则您的表可能由于某种原因已损坏。尝试:

REPAIR TABLE table_name;

或尝试备份数据,销毁并重新创建表并将数据从备份重新填充到表中(这也将重新创建索引)

访问MySQL 参考手册 - 重建表

于 2013-03-15T19:22:20.103 回答