Рассмотрим следующий запрос:
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 работает нормально, как и серверы Linux с MySQL 5.0.27.
Может ли кто-нибудь объяснить разницу между одним планом объяснения с использованием ref = func и другим с использованием ref = odysseyB.CF.COMPANY_ID?
Спасибо.