2015-12-02 52 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