2016-05-10 95 views
0

我有一个优化的问题,我想执行的子查询第一SQL子查询优化,如何执行子查询第一

EXPLAIN 
SELECT * 
    FROM `References_galaxia` 
    , Link_galaxia 
WHERE linkReferenced IN (SELECT id 
          FROM Link_galaxia 
          WHERE idConceptStart IN (616269,616268,615721) 
           AND idConceptLink = 315 
           AND idConceptTarget = 29209 
         ) 
    AND `References_galaxia`.linkReferenced = Link_galaxia.id 
    AND `References_galaxia`.idConcept IN (416,36053,36088,36037) 

主要查询返回一百万条记录到存储数据的hudge量。虽然子查询

SELECT ID FROM Link_galaxia WHERE idConceptStart IN (616269,616268,615721)AND idConceptLink = 315和idConceptTarget = 29209)

返回数据的少量。如何管理先执行子查询?

的结果说明

1 PRIMARY References_galaxia ALL unique_ref,linkReferenced NULL NULL NULL 9163156 Using where 
1 PRIMARY Link_galaxia eq_ref PRIMARY PRIMARY 4 eds_sandra.References_galaxia.linkReferenced 1 
2 DEPENDENT SUBQUERY Link_galaxia eq_ref PRIMARY,idx_name,idConceptStart,idConceptStart_4,idConceptTarget,idConceptLink PRIMARY 4 References_galaxia.linkReferenced 1 Using where 

谢谢你很多关于你的帮助!

+3

你似乎不太喜欢'JOIN'这个词。 – Strawberry

回答

0

的查询,如下面的代码将会显得更优化:

SELECT columns, I, actually, want 
    FROM `References_galaxia` r 
    JOIN Link_galaxia x 
    ON x.id = r.linkreferenced 
    JOIN Link_galaxia y 
    ON y.id = r.linkReferenced 
WHERE r.idConcept IN (416,36053,36088,36037) 
    AND y.idConceptStart IN (616269,616268,615721) 
    AND y.idConceptLink = 315 
    AND y.idConceptTarget = 29209 

有关提高此查询的性能帮助,我们需要看到表创建语句对所有相关表格,以及说明。

+0

太棒了! Woks like a charm – user3032887

+0

我必须承认我更喜欢原始查询 - 除了那个过时的连接语法。我认为'IN'子句使其更具可读性。但看起来,MySQL仍然有一个'IN'子句的弱点。我认为他们终于设法更好地处理了它们。 @ user3032887:你使用的是哪个版本? –

+0

我们使用版本5.1.49 – user3032887

0
SELECT * 
    FROM `References_galaxia` 
    , Link_galaxia 
WHERE `References_galaxia`.linkReferenced = Link_galaxia.id 
    AND `References_galaxia`.idConcept IN (416,36053,36088,36037) 
    AND Link_galaxia.idConceptStart IN (616269,616268,615721) 
    AND Link_galaxia.idConceptLink = 315 
    AND Link_galaxia.idConceptTarget = 29209 
0

只要运行在可变

SELECT id INTO @idvar FROM Link_galaxia 
        WHERE idConceptStart IN (616269,616268,615721) 
        AND idConceptLink = 315 
        AND idConceptTarget = 29209 

修改子查询和店铺ID,包括该变种(@idvar)到主SQL

SELECT * 
    FROM `References_galaxia` 
    , Link_galaxia 
WHERE linkReferenced IN @idvar 
    AND `References_galaxia`.linkReferenced = Link_galaxia.id 
    AND `References_galaxia`.idConcept IN (416,36053,36088,36037); 

完整代码可以与交易:

START TRANSACTION; 
SELECT id INTO @idvar FROM Link_galaxia 
         WHERE idConceptStart IN (616269,616268,615721) 
         AND idConceptLink = 315 
         AND idConceptTarget = 29209; 
SELECT * 
    FROM `References_galaxia` 
    , Link_galaxia 
WHERE linkReferenced IN @idvar 
    AND `References_galaxia`.linkReferenced = Link_galaxia.id 
    AND `References_galaxia`.idConcept IN (416,36053,36088,36037); 
COMMIT;