【发布时间】:2015-12-03 10:49:28
【问题描述】:
有人提出了类似的问题,我已针对每条建议重新编写了此查询,但无法找出问题所在。当向 EXPLAIN EXTENDED 提交以下查询时,我同时收到 'Type' = 'ref' 并且为每个表找到了一个键(尽管我不知道为什么 'isActive' 是为派生表 'CS' 选择的键。
SELECT
distinct
CS.BLNUMBER
,CS.CONTAINER
,s.status
#,s.location
#,s.dateandtime
FROM
CUSTOMERSHIPMENTS CS
INNER JOIN SHIPMENTS S
ON CS.BLNUMBER = S.BLNUMBER
AND CS.CONTAINER = S.CONTAINERNUMBER
WHERE
cs.blnumber <>''
and CS.CDATE > NOW() - INTERVAL 3 MONTH
and CS.ISACTIVE = 1
and cs.hostcompany_id = cs.company_id
AND S.STATUS <> ''
当我为这个联接分配一个别名并再次加入“customershipments”表时,这次称为“CS2”,如下所示:
FROM
(
SELECT
distinct
CS.BLNUMBER
,CS.CONTAINER
,s.status
#,s.location
#,s.dateandtime
FROM
CUSTOMERSHIPMENTS CS
INNER JOIN SHIPMENTS S
ON CS.BLNUMBER = S.BLNUMBER
AND CS.CONTAINER = S.CONTAINERNUMBER
WHERE
cs.blnumber <>''
and CS.CDATE > NOW() - INTERVAL 3 MONTH
and CS.ISACTIVE = 1
and cs.hostcompany_id = cs.company_id
AND S.STATUS <> ''
) temp
INNER JOIN CUSTOMERSHIPMENTS CS2
ON temp.blnumber = CS2.BLNUMBER
and temp.container = cs2.container
EXPLAIN EXTENDED 现在立即告诉我:
id select_type table type possible_keys key key_len ref rows filtered Extra
1 PRIMARY derived2 ALL NULL NULL NULL NULL 45120 100.00 Using temporary
但是“Derived2”指向 EXPLAIN EXTENDED ID 的 2,它是我在 CS 和 S 之间的连接。它是如何从有钥匙变成找不到钥匙的?我想不通。
【问题讨论】:
-
什么版本的 MySQL? 5.6 有一些子查询的改进; 5.7 有更多。
标签: mysql optimization derived explain