【问题标题】:Very Slow Query in MySQLMySQL中非常慢的查询
【发布时间】:2012-02-10 10:33:27
【问题描述】:

我有一个类似的场景;

我有一个名为“tbl_gust_comb_archve_01nov11_beyond”的表

在这些字段上设置索引键“Gidgipsiteidkwkwtypedtgpagedated

这是我的查询:

SELECT SQL_CALC_FOUND_ROWS 
  gid, gip, siteid, kw, kwtype, dt, count(id) as vpage, sum(mapped) as mapped 
FROM 
  tbl_gust_comb_archve_01nov11_beyond 
WHERE 
  confirmation = 1 
AND 
  dated BETWEEN '2012-01-31' AND '2012-01-31' 
AND 
  siteid = 'bing' 
GROUP BY gid 
ORDER BY dt 
DESC LIMIT 0,50

如果您将日期设为 RANGE,例如 '2012-01-31' AND '2012-02-01',则结果将需要更长的时间,然后 10-30 分钟。

如果您有一个日期范围并删除“GROUP BY”,那么结果会快得多(大约 5 分钟)。尽管!去掉GROUP BY之后,5分钟也太多了……

表大小为“30mill 记录和 12Gig”。

谢谢!

【问题讨论】:

  • 您是否尝试过使用 EXPLAIN 运行这些查询?在这种情况下,这应该始终是您的第一步

标签: mysql database optimization database-performance


【解决方案1】:

您应该首先 do EXPLAIN on the query,正如 Mark Ba​​ker 在他的评论中所建议的那样。

但可能在这些列上创建多列索引应该可以解决问题:

  • dt(这应该是第一个)
  • confirmation
  • dated
  • siteid
  • gid

我不确定应该如何索引gid(在哪个位置等)。

这里有更多详细信息,因此您可以自行决定解决方案:

【讨论】:

    【解决方案2】:

    如果 siteid 变化不大,您可以尝试删除 siteid 上的索引。 如果你有 30mill。记录和 1/3 与 siteid == "bing",那么您的查询将

    1. 抓住那些 10mill。记录
    2. 之后在这 10 个工厂上应用您的日期查找。记录,这可能真的很慢。

    这很合乎逻辑,因为选择一个范围通常比选择一个简单的值要长。如果 siteid 变化很大,您可以尝试在 datedsiteid 上添加双重索引。

    对于confirmation字段,既然你在一个存档表中,也许你可以将那些没有确认的人移到另一个表中。如果您能够移除此检查,您还可以获得一些速度。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-14
      • 2021-12-09
      • 1970-01-01
      • 1970-01-01
      • 2019-09-29
      相关资源
      最近更新 更多