在MySQL中非常缓慢的查询
问题描述:
我有一个像这样的场景;在MySQL中非常缓慢的查询
我有一个名为 “tbl_gust_comb_archve_01nov11_beyond
”
索引键在这些领域 “Gid
,gip
,siteid
,kw
,kwtype
,dt
,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
如果您将日期设置为一个范围,例如'2012-01-31' AND '2012-02-01'
那么结果将花费较长的时间10-30分钟。
如果你有一个日期范围,并删除“GROUP BY
”,那么结果会更快(约5分钟)。虽然!删除GROUP BY
后,5分钟也太多了......
表格大小是“30mill记录和12Gig”。
谢谢!
答
如果siteid变化不大,您可以尝试删除您的索引siteid。 如果你有30mill。记录和1/3与SITEID == “兵”,那么你的查询将
- 抓住这些10mill。记录
- 在这10台磨机上应用你的日期查找。记录,这可能非常慢。
这很合乎逻辑,因为选择一个范围一般比选择一个简单的值要长。如果siteid确实有很大的不同,您可以尝试在日期 & siteid上添加双重索引。
对于确认字段,因为您在归档表中,也许您可以将尚未确认的人移动到其他表中。如果您能够取消此检查,您也可以获得一些速度。
答
你应该首先do EXPLAIN
on the query,正如Mark Baker在他的评论中所建议的那样。
但可能产生对这些列的多列索引就可以解决这个问题:
-
dt
(这大概应该是第一个) confirmation
dated
siteid
gid
我不知道gid
应该如何索引(在哪个位置等)。
详细信息都在这里,所以你可以在你自己的解决方案作出决定:
有你试着用EXPLAIN运行这些查询?这应该永远是你在这种情况下的第一步 – 2012-02-10 10:35:11