2013-07-20 146 views
0

我有很多嵌套的SELECT語句的大型查詢。一個簡化版本,可能是這樣的:內部查詢的MySQL查詢緩存

SELECT * FROM tableA WHERE x IN(
    SELECT * FROM tableB WHERE x IN(
     SELECT * FROM tableC WHERE user_id = y 
    ) 
) 

重要的是,最裏面的聲明看USER_ID並選擇ID號碼清單查詢的其餘部分使用開始了。

我遇到的問題是,即使兩個用戶在tableC中有相同的數據,查詢的其餘部分似乎沒有被緩存。

例如,如果SELECT * FROM tableC WHERE user_id = 1返回(1,2,3,4,5) 和SELECT * FROM tableC WHERE user_id = 2也返回(1,2,3,4,5)

如果我運行與完整查詢USER_ID = 1執行時間約爲0.007秒。如果我重新運行查詢,我會減少0.002的執行時間。如果我將user_id更改爲2並運行查詢,則第一次運行查詢時,執行時間會回到0.007。 mySQL是否可以緩存查詢的各個部分的結果?

回答

0

看來你使用的是mysql。所以當你第一次運行查詢'SELECT * FROM tableC WHERE user_id = 1'時,你會得到'1,2,3,4,5'的結果,並且你的查詢進入查詢緩存。因此第二次運行後的執行時間少於第一次。在這種情況下,您的結果與您的第一個查詢相關聯。 當你運行第二個查詢時,你的服務器不知道任何事情。所以它運行它並返回一些東西(在你的情況下結果是相同的)。下一次當你運行第二個查詢時,你將從查詢緩存中獲得它,並且它將會非常快。無論如何,服務器將在查詢緩存中存儲兩個不同的記錄。

+0

查詢的這部分怎麼樣?SELECT * FROM tableB WHERE x IN(..)'?結果與user_id = 1或2時相同。但是,查詢的執行時間暗示不使用緩存 – user1063998

+0

查詢緩存的工作原理如下:1.獲取查詢並創建哈希。 2.檢查是否有緩存結果。 3.如果是,則返回它,如果沒有保存到緩存並返回。在你的情況下,你會給兩個不同的哈希,因爲查詢是不同的,並且它們返回什麼結果並不重要 –

+0

謝謝安德烈。我想解決方案是將較大的查詢分成兩個較小的查詢。這樣我可以節省重新計算昂貴的,如果可能的話 – user1063998