在MySQL中查询非常慢

时间:2012-02-10 10:33:28

标签: mysql database optimization database-performance

我有一个类似的场景;

我有一个名为“tbl_gust_comb_archve_01nov11_beyond

的表格

在这些字段“Gidgipsiteidkwkwtypedt,{{1 },gpage

这是我的疑问:

dated

如果您将日期设为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 等范围,那么结果将需要更长时间,然后是10-30分钟。

如果你有一个日期范围并删除“'2012-01-31' AND '2012-02-01'”,那么结果将会快得多(大约5分钟)。虽然!删除GROUP BY后,5分钟也太多了......

表格大小为“30mill record and 12Gig”。

谢谢!

2 个答案:

答案 0 :(得分:1)

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

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

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

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

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

答案 1 :(得分:0)

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

  1. 抓住那些10毫米。记录
  2. 然后在那些10工厂上应用日期查找。记录,这可能非常慢。
  3. 这是合乎逻辑的,因为选择范围通常比选择简单值更长。如果 siteid 确实变化很大,您可以尝试在日期&上添加双重索引。 SITEID

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