【问题标题】:How to improve the speed of this query execution如何提高此查询的执行速度
【发布时间】:2014-03-19 04:59:46
【问题描述】:

我有以下疑问:

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 替换确定性,它仍然需要很多时间 我应该怎么办 ?有什么可以提高速度的吗?

【问题讨论】:

  • 三个查询哪个慢?尝试解释,或单独运行每一个。为每个表发布 CREATE 也将有助于分析。
  • 感谢您快速回答这部分:SELECT DataitemID from entity_dataitem_relation where EpochID IN (SELECT ID FROM epoch WHERE StartDateTime>='2013-11-01' AND EndDateTime

标签: mysql


【解决方案1】:

要尝试减少表扫描,您可以使用 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 表中的记录越多,速度就越慢。

【讨论】:

  • 谢谢,通过覆盖索引,你的意思是我应该例如在推文表中索引确定性吗?(我知道如何进行简单的索引,但我想知道覆盖索引是否不同?
  • 我按照你说的做了,我的速度有了很大的提高,但是覆盖索引仍然是不可接受的,你的意思是这样的吗:在 entity_dataitem_relation(EpochID) 上创建索引 Epoch
  • @HamedMinaee,我希望你能在 Internet 上查找术语覆盖索引。这些是我列出的多列索引。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-29
  • 1970-01-01
相关资源
最近更新 更多