3

考虑以下查询:

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 

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

如果我在笔记本电脑上运行 EXPLAIN,我会得到这个

| 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 | 

而在我的所有其他服务器上它都给出了这个(注意 ref 列中的差异)

| 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 | 

如果我删除连接、子查询或最后一个分组依据,那么我会得到预期的结果。

我假设这是一个配置问题,但这不是我以前见过的问题。有谁知道这可能是什么原因?

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

谁能解释一个使用 ref=func 的解释计划和另一个使用 ref=odysseyB.CF.COMPANY_ID 的解释计划之间的区别?

谢谢。

4

2 回答 2

1

在两台机器上:

mysql> SHOW CREATE TABLE CARRIER_FEE CF;

确保两个表 ENGINE 类型相同。

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

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

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

于 2009-09-15T04:02:13.820 回答
0

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

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

顺便说一句,与您的问题相切,但我使用外连接解决了这些“每组最大行”类型的查询:

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;

这种类型的解决方案通常比您当前使用的相关子查询解决方案快得多。我认为这不会改变查询的结果,我只是提供它作为一个选项。

于 2009-09-08T01:49:29.460 回答