(0)能夠先使用 EXPLAIN 關鍵字可讓你知道MySQL是如何處理你的SQL語句的。這能夠幫咱們分析是查詢語句或是表結構的性能瓶頸。mysql
(1)寫sql要明確須要的字段,要多少就寫多少字段,而不是濫用 select *sql
(2)能夠用使用鏈接(JOIN)來代替子查詢緩存
(3)使用分頁語句:limit start , count 或者條件 where子句時,有什麼可限制的條件儘可能加上,查一條就limit一條。作到不濫用。好比說我以前作過的的p2p項目,只是須要知道有沒有一個滿標的借款,這樣的話就能夠用上 limit 1,這樣mysql在找到一條數據後就中止搜索,而不是全文搜索完再中止。服務器
(4)開啓查詢緩存:性能
大多數的MySQL服務器都開啓了查詢緩存。這是提升查詢有效的方法之一。當有不少相同的查詢被執行了屢次的時候,這些查詢結果會被放到一個緩存中,這樣,後續的相同的查詢就不用操做表而直接訪問緩存結果了。優化
查詢緩存工做流程:設計
A):服務器接收SQL,以SQL+DB+Query_cache_query_flags做爲hash查找鍵;blog
B):找到了相關的結果集就將其返回給客戶端;索引
C):若是沒有找到緩存則執行權限驗證、SQL解析、SQL優化等一些列的操做;事務
D):執行完SQL以後,將結果集保存到緩存
固然,並非每種狀況都適合使用緩存,衡量打開緩存是否對系統有性能提高是一個總體的概念。那怎麼判斷要不要開啓緩存呢,以下:
1)經過緩存命中率判斷, 緩存命中率 = 緩存命中次數 (Qcache_hits) / 查詢次數 (Com_select)、
2)經過緩存寫入率, 寫入率 = 緩存寫入次數 (Qcache_inserts) / 查詢次數 (Qcache_inserts)
3)經過 命中-寫入率 判斷, 比率 = 命中次數 (Qcache_hits) / 寫入次數 (Qcache_inserts), 高性能MySQL中稱之爲比較能反映性能提高的指數,通常來講達到3:1則算是查詢緩存有效,而最好可以達到10:1
相關參數及命令:
與緩存相關的主要參數以下表所示。可使用命令SHOW VARIABLES LIKE '%query_cache%'查看
緩存數據失效時機
在表的結構或數據發生改變時,查詢緩存中的數據再也不有效。有這些INSERT、UPDATE、 DELETE、TRUNCATE、ALTER TABLE、DROP TABLE或DROP DATABASE會致使緩存數據失效。因此查詢緩存適合有大量相同查詢的應用,不適合有大量數據更新的應用。
可使用下面三個SQL來清理查詢緩存:
一、FLUSH QUERY CACHE; // 清理查詢緩存內存碎片。
二、RESET QUERY CACHE; // 從查詢緩存中移出全部查詢。
三、FLUSH TABLES; //關閉全部打開的表,同時該操做將會清空查詢緩存中的內容。
InnoDB與查詢緩存:
Innodb會對每一個表設置一個事務計數器,裏面存儲當前最大的事務ID.當一個事務提交時,InnoDB會使用MVCC中系統事務ID最大的事務ID跟新當前表的計數器.
只有比這個最大ID大的事務能使用查詢緩存,其餘比這個ID小的事務則不能使用查詢緩存.
另外,在InnoDB中,全部有加鎖操做的事務都不使用任何查詢緩存
喜歡的小夥伴,點個關注吧,天天分享新的內容!