2009-09-07 120 views
3

考虑下面的查询:MySQL的解释异常

select FEE_NUMBER 
from CARRIER_FEE CF 
left outer join CONTYPE_FEE_LIST cfl on CF.CAR_FEE_ID=cfl.CAR_FEE_ID and cfl.CONT_TYPE_ID=3 
where CF.SEQ_NO = (
    select max(CF2.SEQ_NO) from CARRIER_FEE CF2 
    where CF2.FEE_NUMBER=CF.FEE_NUMBER 
    and CF2.COMPANY_ID=CF.COMPANY_ID 
    group by CF2.FEE_NUMBER) 
group by CF.CAR_FEE_ID 

在我的笔记本电脑这个不返回任何结果。在我的服务器上使用完全相同的(转储)数据库,它会返回结果。

如果我跑我的笔记本电脑的解释,我得到这个

| id | select_type  | table | type | possible_keys        | key     | key_len | ref     | rows | Extra          | 
+----+--------------------+-------+-------+---------------------------------------------+-----------------------+---------+------------------------+------+----------------------------------------------+ 
| 1 | PRIMARY   | CF | index | NULL          | PRIMARY    | 8  | NULL     | 132 | Using where         | 
| 1 | PRIMARY   | cfl | ref | FK_CONTYPE_FEE_LIST_1,FK_CONTYPE_FEE_LIST_2 | FK_CONTYPE_FEE_LIST_1 | 8  | odysseyB.CF.CAR_FEE_ID | 6 |            | 
| 2 | DEPENDENT SUBQUERY | CF2 | ref | FK_SURCHARGE_1        | FK_SURCHARGE_1  | 8  | func     | 66 | Using where; Using temporary; Using filesort | 

而我所有的其他服务器也给出了这样的(注意裁判列的差异)

| id | select_type  | table | type | possible_keys        | key     | key_len | ref     | rows | Extra          | 
+----+--------------------+-------+-------+---------------------------------------------+-----------------------+---------+------------------------+------+----------------------------------------------+ 
| 1 | PRIMARY   | CF | index | NULL          | PRIMARY    | 8  | NULL     | 132 | Using where         | 
| 1 | PRIMARY   | cfl | ref | FK_CONTYPE_FEE_LIST_1,FK_CONTYPE_FEE_LIST_2 | FK_CONTYPE_FEE_LIST_1 | 8  | odysseyB.CF.CAR_FEE_ID | 6 |            | 
| 2 | DEPENDENT SUBQUERY | CF2 | ref | FK_SURCHARGE_1        | FK_SURCHARGE_1  | 8  | odysseyB.CF.COMPANY_ID | 66 | Using where; Using temporary; Using filesort | 

如果我删除连接,子查询或最后一组 - 然后我得到预期的结果。

我假设这是一个配置问题,但它不是我以前见过的。有人知道可能会导致这种情况吗?

我的笔记本电脑在运行MySQL 5.0.41的OSX 10.6。另一台运行OSX 10.5.7和MySQL 5.0.37的笔记本电脑运行良好,运行MySQL 5.0.27的Linux服务器也是如此。

任何人都可以解释一个解释计划使用ref = func和另一个使用ref = odysseyB.CF.COMPANY_ID之间的区别吗?

谢谢。

+0

哇!相同的数据集?不同的结果?这是一个非常严重的问题... – 2009-09-07 18:24:10

+0

是的。相同的数据集。不同的结果。不好。 – Damo 2009-09-07 18:29:25

+1

你确定它是相同的数据集吗?你的解释中的行有点不同。201 vs 202 16 vs 18 100 vs 101 – Rufinus 2009-09-07 20:13:44

回答

0

我不知道它为什么会给出不同的结果。您的不需要具有完全相同的数据转储,因为您的EXPLAIN报告中报告的行数不同。我建议做一些简单的查询来测试你的假设。

同时仔细检查你是否真的在两台服务器上执行完全相同的SQL查询。例如,如果您无意中将左外部联接更改为内部联接,则可能会使整个查询不返回结果。

BTW,切到你的问题,但我解决了这些类型的外查询的“每组的最大行”加盟:

select FEE_NUMBER 
from CARRIER_FEE CF 
left outer join CARRIER_FEE CF2 
    on CF.FEE_NUMBER = CF2.FEE_NUMBER and CF.COMPANY_ID = CF.COMPANY_ID 
    and CF.SEQ_NO < cf2.SEQ_NO 
left outer join CONTYPE_FEE_LIST cfl 
    on CF.CAR_FEE_ID=cfl.CAR_FEE_ID and cfl.CONT_TYPE_ID=3 
where CF2.SEQ_NO IS NULL 
group by CF.CAR_FEE_ID; 

这种类型的解决方案往往比相关子查询解决方案,你的速度快得多,目前正在使用。我不认为这可能会改变查询的结果,我只是提供它作为一个选项。

+0

谢谢。这当然是一种选择。我已经更新了解释计划。他们正在使用完全相同的数据集。 – Damo 2009-09-08 09:31:32

1

在两台机器上:

mysql> SHOW CREATE TABLE CARRIER_FEE CF; 

确保两个表类型的发动机是相同的。

此外,由于您在机器上使用OS X 10.6时出现错误?也许该操作系统上的数据类型具有不同于10.5.x的特性。

似乎人们对雪豹有兼容性问题。尝试在10.6笔记本电脑上安装MySQL 5.4。

http://forums.mysql.com/read.php?10,278942,278942#msg-278942