考虑以下问题:
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的另一个解释计划之间的区别吗?
感谢。
答案 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;
此类解决方案通常比您当前使用的相关子查询解决方案快得多。我不认为这可能会改变查询的结果,我只是提供它作为选项。