sql - MySQL解释异常

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

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

我假设这是一个配置问题,但它不是我以前见过的问题。有人知道是什么原因造成的吗?

我的笔记本电脑运行的是 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 的解释计划之间的区别?

谢谢。

最佳答案

在两台机器上:

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

关于sql - MySQL解释异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1390459/

相关文章:

SQL查询以在给定条件下明确获取总和

php - SQL 调用中 'a' 类上的 CSS

php - SQLite 在通过 URL 访问时显示数据

sql - 如何解决 SSIS 包中 OLE DB 目标中的非空约束?

sql - 如何使用参数/变量并一起解释

postgresql - postgres如何决定是使用index scan还是seq scan?

c# - 如何从 C# 使用 mysql.exe

java - 使用左连接、自定义包装器和动态搜索词的条件查询

php - 使用 MySQL 进行多区域市场数据库设计

sql - 相同的 SELECT 与 DELETE 查询创建不同的查询计划,执行时间差异很大