我的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数据库引擎。
如果需要任何其他输入,请告诉我。
答案 0 :(得分:1)
感谢大家的帮助。
MySql 5.1.30中存在MyISAM分区的问题,在敲了几天之后,我已经通过将MySQL升级到5.1.52版本或重新组织分区解决了这个问题。
供您参考,请参阅MySQL论坛上报告的以下错误:
答案 1 :(得分:0)
如果使用索引查询结果有误,则表可能由于某种原因而损坏了表。尝试:
REPAIR TABLE table_name;
或尝试备份数据,销毁并重新创建表,并将数据从备份中重新填充到表中(这也将重新创建索引)