MySQL解释异常

时间:2009-09-07 18:16:07

标签: sql mysql sql-execution-plan

考虑以下问题:

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 | 

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

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

我的笔记本电脑使用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的另一个解释计划之间的区别吗?

感谢。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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;

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