2012-02-07 72 views
3

我想從2.5秒爲mysql計數查詢減少加載時間。查詢中的所有列都有一個索引。MySQL計數優化

SELECT COUNT(1) 
FROM song AS s 
JOIN song_text AS st 
    ON(st.song_id = s.song_id) 
JOIN phpfox_user AS u 
    ON(u.user_id = s.user_id) 
WHERE st.lyrics LIKE '%a%' AND s.is_active = 1 AND s.public = 1 

獲取返回行的查詢在0.0009060秒內加載。

SELECT s.*, st.lyrics, u.first_name 
FROM song AS s 
JOIN song_text AS st 
    ON(st.song_id = s.song_id) 
JOIN phpfox_user AS u 
    ON(u.user_id = s.user_id) 
WHERE st.lyrics LIKE '%a%' AND s.is_active = 1 AND s.public = 1 
ORDER BY s.date_added DESC 
LIMIT 12 

爲什麼計數查詢比返回行的查詢有更多的加載時間?可以採取什麼措施將計數查詢的加載時間減少到類似於其他查詢的時間?

+0

你試過在查詢上運行'EXPLAIN'嗎?這應該給你一些見解。我相信@AdityaNaidu可能是正確的 - 第二個查詢中的「LIMIT」可能會過濾第一個查詢中所需的大量工作。 – evan 2012-02-07 22:28:02

+0

從第二個查詢中刪除「LIMIT」子句併發布查詢時間。使用'SELECT SQL_NO_CACHE <查詢的其餘部分>'從等式中刪除緩存。 – 2012-02-07 22:40:47

+0

從第二個查詢中刪除限制導致查詢時間爲7.6967690秒。 – user1195817 2012-02-07 22:53:19

回答

0

你關心計數中的u.first_name值嗎?如果否,則刪除第二次加入,它似乎不添加任何值。

此外,嘗試計數(s.song_id)從歌曲表而不是count(1)。我不確定這是真正的優化還是我的想象。

0

您的第二個查詢一旦完成前12條記錄就完成了。而您的第一個(計數)查詢必須加入所有表中的所有列。

這是我能看到的唯一區別!

0

我認爲這是因爲

LIMIT 12 

你只能望塵莫及只有12 SELECT語句的線條。

0

第一個必須查看查詢的執行計劃。

我想在第一個查詢中的臨時表是相當大的,因此聚合應用於大量的數據。

另一方面,LIMIT 12已經告訴查詢處理器,說明所有行只有12個是沒有意義的,因此臨時表很小。