使用索引时,Mysql组返回错误的结果

时间:2013-02-28 11:53:43

标签: mysql indexing group-by

我的mySql查询中有一个问题。问题在我们的任何本地机器上都不可复制。 我有一个简单的查询

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

返回结果 -

ID
15920

由于数据库中的两个数据都存在数据,因此出现意外结果。

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

+----+-------------+------------+-------+--------------------+--------------------+---------+-----+------+---------------------------------------+
| id | select_type | table      | type  | possible_keys      | Key                | key_len | Ref | rows | Extra                                 |
+----+-------------+------------+-------+--------------------+--------------------+---------+-----+------+---------------------------------------+
|  1 | SIMPLE      | TABLE_NAME | range | CUST_SID_SRUN_INDX | CUST_SID_SRUN_INDX |       4 |     |    1 | Using where; Using index for group-by |
+----+-------------+------------+-------+--------------------+--------------------+---------+-----+------+---------------------------------------+

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

•强制派生表 -

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

•使用having子句而不是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数据库引擎。

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

2 个答案:

答案 0 :(得分:1)

感谢大家的帮助。

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

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

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

答案 1 :(得分:0)

如果使用索引查询结果有误,则表可能由于某种原因而损坏了表。尝试:

REPAIR TABLE table_name;

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

访问MySQL Reference Manual - rebuilding tables