【问题标题】:Joining mulitple tables on a varchar key - MYSQL : Performance Issues在 varchar 键上连接多个表 - MYSQL:性能问题
【发布时间】:2015-09-20 23:56:34
【问题描述】:

我的问题是 150 万个数据集的连接查询大约需要 7-15 秒,我想显着减少它,但不知道如何。

我有一个设计如下的数据库:

Tbl1:ID - Time1 - Time 2 - Time2

Tbl2:ID - Topic_ID

Tbl3:ID - Location_ID

Tbl4:ID - Status_ID

第一个 ID 始终相同,并且两个列上始终有键。加入 2 个表很容易,但只要我尝试加入第 3 个表,例如:

Select t1.Time1,t2.Topic_ID,t3_Location_id 
from
(select ID,Time1 from tbl1 where time > 400 and < 500 ) as t1
inner join tbl2 as t2 on t2.Id = t1.ID
inner join tbl3 as t3 on t2.id = t3.ID
where t2.topic_ID = 2

时间从 0.02 秒大幅增长到 7-15 秒。

我现在的问题是,除了表 2 之外的所有表都存在 1:1 关系,其中一个 Id 可能有多个主题。

我希望我能体面地解释我的问题。

非常感谢您的帮助

【问题讨论】:

  • 所有ID列都被索引了吗? t2.topic 呢?
  • 是索引无处不在
  • 如果是 Oracle,我建议检查表的统计信息是否是最新的。你能为mysql做同样的事情吗? dev.mysql.com/doc/innodb/1.1/en/…数据量如何?
  • 时间表大约是 250 mb,其余的大约是每个 80 mb
  • 我应该补充一点,我的 ID 是 16 个字符的 variableChar

标签: mysql sql join inner-join


【解决方案1】:

您可以尝试以下查询并检查一次。我刚刚在您的派生表中添加了一个 group by 子句。我的感觉是 group by 会给你 ID 和 TIME 的唯一组合,因此会减少你派生表中生成的记录集,从而降低性能。

            Select t1.Time1,t2.Topic_ID,t3_Location_id 
        from
        (select ID,Time1 from tbl1 where time > 400 and < 500 group by        ID,Time1) as t1
        inner join tbl2 as t2 on t2.Id = t1.ID
        inner join tbl3 as t3 on t2.id = t3.ID
        where t2.topic_ID = 2

【讨论】:

  • 没问题。乐于助人。
猜你喜欢
  • 2011-12-15
  • 2017-12-06
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-02
相关资源
最近更新 更多