mysql的查詢緩存是在完整的select語句基礎上判斷的,並且只是在剛收到SQL語句的時候才檢查,因此子查詢和存儲過程都沒辦法使用查詢緩存。mysql
若是查詢語句中包含任何的不肯定因素或者函數,那麼就不會命中查詢緩存,不肯定因素指客戶端協議的版本等,而不肯定函數指now()
這種函數,它隨着時間變化而變化,是不肯定的。sql
在一個事務提交以前表的相關查詢是不走緩存的。緩存
打個比喻就是mysql將你的整個
sql語句原封不動地先檢查是否有不肯定函數,若是有不肯定函數就不走緩存,若是沒有不肯定函數,那麼將sql語句作個md5計算,若是找獲得計算的值就走緩存,不然就不走緩存。函數
爲了用上查詢緩存,優化的思路有下面這些:優化
1.將子查詢或者聯結拆開成單表的查詢,由於整個sql語句只要有不肯定的函數就不走緩存,拆開後其中的某些查詢可能就走緩存了。code
2.將不肯定函數替換成肯定的值,好比你用系統函數current_date()
生成的日期就能夠用提早計算好的日期替換掉。事務