2015-12-02 49 views
1

我有一个 '简单' 的查询:MySQL的复制到tmp下表造成挂

SELECT searchterm, count(searchterm) as intNumHits 
FROM site_searches 
WHERE searchdate >= 20151202 AND searchdate <= 20151202 
GROUP BY searchterm 
ORDER BY intNumHits DESC 
LIMIT 50; 

site_searches为> 750万行。

searchterm & searchdate被编入索引。

从这里上其他的答案中,max_heap_table_sizetmp_table_size的受到质疑。我的设置是:

max_heap_table_size:16777216

tmp_table_size的:264241152

但是,当我运行查询,它似乎挂在 “复制到tmp下表”。

如果我删除count(searchterm)和GROUP BY选项,查询将运行,但仍需要19秒!

有没有人有任何建议?

编辑:

运行EXPLAIN的查询提供了以下:

id = 1 
select_type = SIMPLE 
table = site_searches 
type = index 
possible_keys = searchdate 
key = searchterm 
key_len = 767 
ref = NULL 
rows = 7431801 
Extra = Using where; Using temporary; Using filesort 

感谢

+0

有关于searchdate和intNumHits和searchterm的好索引吗? – Thomas

+0

尝试使用EXPLAIN提前执行查询(EXPLAIN SELECT等),并发布结果。通过解释,我们可以看到查询如何使用索引。 – faster2b

+0

show desc site_searches,看看如果searchdate是int?如果它的char,那么使用引号ex。 '20151202' – Hytool

回答

2

看看searchdate数据类型为int?如果它的char,那么使用引号ex。 '20151202'

SELECT searchterm, count(searchterm) as intNumHits 
    FROM site_searches 
    WHERE searchdate >= '20151202' AND searchdate <= '20151202' 
    GROUP BY searchterm 
    ORDER BY intNumHits DESC 
    LIMIT 50; 
+0

这就是解决方案 - 查询现在需要0.168s运行!谢谢。 – JezB

+0

很高兴,它工作!有时,SQL调整需要非常小的更改! – Hytool