2012-02-10 189 views
1

我有一个像这样的场景;在MySQL中非常缓慢的查询

我有一个名为 “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 

如果您将日期设置为一个范围,例如'2012-01-31' AND '2012-02-01'那么结果将花费较长的时间10-30分钟。

如果你有一个日期范围,并删除“GROUP BY”,那么结果会更快(约5分钟)。虽然!删除GROUP BY后,5分钟也太多了......

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

谢谢!

+12

有你试着用EXPLAIN运行这些查询?这应该永远是你在这种情况下的第一步 – 2012-02-10 10:35:11

回答

0

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

  1. 抓住这些10mill。记录
  2. 在这10台磨机上应用你的日期查找。记录,这可能非常慢。

这很合乎逻辑,因为选择一个范围一般比选择一个简单的值要长。如果siteid确实有很大的不同,您可以尝试在日期 & siteid上添加双重索引。

对于确认字段,因为您在归档表中,也许您可​​以将尚未确认的人移动到其他表中。如果您能够取消此检查,您也可以获得一些速度。

1

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

但可能产生对这些列的多列索引就可以解决这个问题:

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

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

详细信息都在这里,所以你可以在你自己的解决方案作出决定: