SQL 子查询优化,如何先执行子查询
SQL subqueries optimisation, how to execute subquery first
我有一个优化问题我想先执行子查询
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)
主要查询returns 内存中有大约一百万条记录的大量数据。而子查询
SELECT id FROM Link_galaxia WHERE idConceptStart IN
(616269,616268,615721) AND idConceptLink = 315 AND idConceptTarget =
29209 )
Return数据量少。如何设法先执行子查询?
解释的结果
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
非常感谢您的帮助!
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
像下面这样的查询似乎更优化:
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
为了帮助提高此查询的性能,我们需要查看所有相关 table 的 table 创建语句,以及 EXPLAIN。
只是 运行 修改了子查询并将 ID 存储在变量中
SELECT id INTO @idvar FROM Link_galaxia
WHERE idConceptStart IN (616269,616268,615721)
AND idConceptLink = 315
AND idConceptTarget = 29209
并将此 var (@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;
我有一个优化问题我想先执行子查询
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)
主要查询returns 内存中有大约一百万条记录的大量数据。而子查询
SELECT id FROM Link_galaxia WHERE idConceptStart IN (616269,616268,615721) AND idConceptLink = 315 AND idConceptTarget = 29209 )
Return数据量少。如何设法先执行子查询?
解释的结果
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
非常感谢您的帮助!
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
像下面这样的查询似乎更优化:
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
为了帮助提高此查询的性能,我们需要查看所有相关 table 的 table 创建语句,以及 EXPLAIN。
只是 运行 修改了子查询并将 ID 存储在变量中
SELECT id INTO @idvar FROM Link_galaxia
WHERE idConceptStart IN (616269,616268,615721)
AND idConceptLink = 315
AND idConceptTarget = 29209
并将此 var (@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;