我在其中一个 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 数据库引擎。
如果需要任何其他输入,请告诉我。