我有以下查询:
SELECT SUM(sureness) FROM tweet WHERE ID in
(select DataitemID from entity_dataitem_relation where EpochID IN
(SELECT ID FROM epoch WHERE StartDateTime>='2013-11-01' AND EndDateTime<='2013-11-31')AND
DataitemType=3) ;
我在entity_dataitem_relation表中索引DataitemID以提高速度。我甚至索引EpochID以帮助提高速度,但这个查询仍然非常缓慢,需要2分钟才能执行(值得注意的是我进入了一个项目中间,所以我必须继续其他人做的所以我不要在设计方面具有很大的灵活性)
注意:以下部分非常快:
SELECT DataitemID from entity_dataitem_relation where EpochID IN
(SELECT ID FROM epoch WHERE StartDateTime>='2013-11-01' AND EndDateTime<='2013-11-31');
另一件事:即使我用ID作为表的主键替换确定性,它仍然需要花费很多时间 我该怎么办 ?我能做些什么来提高速度吗?
答案 0 :(得分:2)
要尝试减少表扫描,可以使用JOINS重写此查询:
SELECT SUM(t.sureness)
FROM tweet t
JOIN entity_dataitem_relation edr
ON edr.DataitemID = t.ID
AND edr.DataitemType = 3
JOIN epoch e
ON e.ID = edr.EpochID
AND e.StartDateTime >= '2013-11-01'
AND e.EndDateTime <= '2013-11-31'
添加以下覆盖索引:
tweet(ID, sureness)
entity_dataitem_relation(DataitemID, DataitemType, EpochID)
epoch(ID, StartDateTime, EndDateTime)
MySQL可能仍然会扫描tweet
上索引中的所有行,因此tweet
表中的记录越多,这就越慢。