以下查询:
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,它就会使用主键并再次快速。什么可能导致这种情况?
答案 0 :(得分:0)
如上所述,明确选择cloumns而不是*。在连接条件中使用的列上创建聚簇索引或非聚簇索引,并强制表使用该索引。例如
USE AdventureWorks
GO
SELECT ContactID
FROM Person.Contact WITH (INDEX(AK_Contact_rowguid))
GO