考虑以下查询:
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 的解释计划之间的区别?
谢谢。