2014-02-20 200 views
1

我有這個疑問數查詢優化索引

SELECT COUNT(*) as user_count, `partner` FROM (`my_table`) WHERE date_join <='2014-02-19 23:59:59' AND isConfirm=1 GROUP BY `partner` 

表已經有42萬行,此查詢超時。在查詢期間,我收到了連接到mysql服務器的錯誤。

我已經有索引date_join和解釋結果如下:

id select_type  table type possible_keys key  key_len ref  rows Extra 
1 SIMPLE   my_table range date_join  date_join 9  NULL 112223 Using where; Using temporary; Using filesort 

因此,這似乎利用指數,但還是我收到超時錯誤。我如何進一步優化?

+0

如果u更換'計數(列名)'COUNT(*),會發生什麼' – Krimson

+0

您需要有一個索引與兩個'date_join'和'isConfirm'在裏面。不是2個獨立的索引。 –

+0

它也有同樣的效果。 –

回答

0

如果通過2查詢apporox獲得大致相同的行。 112223行作爲你的解釋建議,那麼創建組合索引沒有任何好處,正如@RKG所建議的那樣,但如果你獲得的行數少得多,那麼它可能是有益的。選擇COUNT(*)FROM my_table WHERE date_join < ='2014-02-19 23:59:59';選擇COUNT(*)FROM my_table WHERE date_join < ='2014-02-19 23:59:59'and isConfirm = 1;

如果您獲得約。從兩個查詢相同的行,那麼你可以檢查以下東西來照顧這個問題:

首先檢查什麼設置以下變量在你的配置文件/etc/my.cnf

tmp_table_size的= ???

max_heap_table_size = ???

sort_buffer_size = ???

join_buffer_size = ???

增加這些變量,你可以得到解決方案,但你必須檢查你的系統中的總內存和什麼值將足夠你。作爲一個嘗試,你可以設定值按照以下,如果你的值小於這些值 -

tmp_table_size的= 1G

max_heap_table_size = 1G

sort_buffer_size的值= 10M

join_buffer_size = 2M

注意:確保你的系統/ tmp目錄也應該有1GB以上的空間。


即使你應該爲你獲取幾乎所有的數據,直到昨日,然後通過應用組還添加了一個較低的日期過濾器在您的查詢。

如果您需要完整的計數到昨天,那麼您可以嘗試下面的查詢。我不確定它是否對您有幫助,但您可以嘗試。

SELECT COUNT(primary_key) AS user_count, `partner` FROM (SELECT primary_key, partner FROM my_table WHERE date_join <='2014-02-19 23:59:59' AND isConfirm=1) a GROUP BY partner; 
+0

這是唯一的方法? –

+0

我在現有答案中添加的另一種方法。 –

+0

謝謝@Zafar。感謝您的幫助 –

0

您可以嘗試在date_join和isConfirm上創建索引。例如:

alter table `my_table` add index `my_index` (`date_join`,`isConfirm`);