Query使用内部联接构建临时表

时间:2015-08-17 22:32:35

标签: mysql sql

以下查询:

SELECT *, t1.col AS some_col, t5.othercol AS other_col
          FROM t1
          JOIN t2 ON t2.id = t1.t2_id
          JOIN t3 ON t3.id = t2.t3_id
          JOIN t4 ON t4.id = t1.t4_id
          JOIN t5 ON t5.id = t4.t5_id 
          ORDER BY timestamp DESC LIMIT 0, 20;

速度慢且占用大量CPU资源。当我解释查询时,我可以看到它为表3(t3)构建临时表和filesort。在possible_keys中,它表示PRIMARY,但它没有使用它(键为NULL)。

一旦我使t3加入LEFT JOIN,它就会使用主键并再次快速。什么可能导致这种情况?

1 个答案:

答案 0 :(得分:0)

如上所述,明确选择cloumns而不是*。在连接条件中使用的列上创建聚簇索引或非聚簇索引,并强制表使用该索引。例如

USE AdventureWorks 
GO
SELECT ContactID
FROM Person.Contact WITH (INDEX(AK_Contact_rowguid))
GO