MySQL中的非常慢的查询

MySQL中的非常慢的查询,mysql,database,optimization,database-performance,Mysql,Database,Optimization,Database Performance,我有这样一个场景 我有一个表名为“tbl\u gust\u comb\u archve\u 0111\u beyond” 在这些字段上设置索引键“Gid,gip,siteid,kw,kwtype,dt,gpage,日期” 及 这是我的疑问: SELECT SQL_CALC_FOUND_ROWS gid, gip, siteid, kw, kwtype, dt, count(id) as vpage, sum(mapped) as mapped FROM tbl_gust_comb_

我有这样一个场景

我有一个表名为“
tbl\u gust\u comb\u archve\u 0111\u beyond

在这些字段上设置索引键“
Gid
gip
siteid
kw
kwtype
dt
gpage
日期

这是我的疑问:

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
如果将日期设置为一个范围,如“2012-01-31”和“2012-02-01”,则结果将花费10-30分钟以上的时间

如果您有一个日期范围并删除“
分组依据”
,则结果会快得多(大约5分钟)。不过!删除
分组依据后,5分钟也太长了

表大小为“30毫米记录和12千兆”

谢谢

如果siteid变化不大,您可以尝试删除siteid上的索引。 如果你有30英镑。用siteid==“bing”记录和1/3,然后您的查询将

  • 抓住那10毫升。记录
  • 随后,在这10个工厂上应用您的日期查找。记录,这可能真的很慢
  • 这是非常合乎逻辑的,因为选择一个范围通常比选择一个简单的值要长。如果siteid变化很大,您可以尝试在dated和siteid上添加双索引

    对于确认字段,由于您位于存档表中,可能您可以将尚未确认的人移动到其他表中。如果您能够删除此检查,您还可以获得一些速度。

    如果siteid变化不大,您可以尝试删除siteid上的索引。 如果你有30英镑。用siteid==“bing”记录和1/3,然后您的查询将

  • 抓住那10毫升。记录
  • 随后,在这10个工厂上应用您的日期查找。记录,这可能真的很慢
  • 这是非常合乎逻辑的,因为选择一个范围通常比选择一个简单的值要长。如果siteid变化很大,您可以尝试在dated和siteid上添加双索引

    对于确认字段,由于您位于存档表中,可能您可以将尚未确认的人移动到其他表中。如果你能够删除这张支票,你也可以获得一些速度。

    你应该首先,正如马克·贝克在评论中所建议的那样

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

    • dt
      (这可能是第一次)
    • 确认
    • 日期
    • siteid
    • gid
    我不确定应该如何索引
    gid
    (在哪个位置等)

    此处提供了更多详细信息,因此您可以自行决定解决方案:

    • ,
    • ,
    • ,
    • ,
    正如马克·贝克(Mark Baker)在评论中所建议的那样,你应该首先这样做

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

    • dt
      (这可能是第一次)
    • 确认
    • 日期
    • siteid
    • gid
    我不确定应该如何索引
    gid
    (在哪个位置等)

    此处提供了更多详细信息,因此您可以自行决定解决方案:

    • ,
    • ,
    • ,
    • ,

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