上篇講解了「mysql優化專題」90%程序員都會忽略的增刪改優化(2),相信大家都有所收獲。接下來這篇是查詢優化。其實,大家都知道,查詢部分是遠遠大于增刪改的,所以查詢優化會花更多篇幅去講解。本篇會先講單表查詢優化(非索引設計)。然后講多表查詢優化。索引優化設計以及庫表結構優化等后面文章再講。
單表查詢優化:(關于索引,后面再開單章講解)
(0)可以先使用EXPLAIN關鍵字可以讓你知道MySQL是如何處理你的SQL語句的。這可以幫我們分析是查詢語句或是表結構的性能瓶頸。
(1)寫sql要明確需要的字段,要多少就寫多少字段,而不是濫用 select *
(2)可以用使用連接(JOIN)來代替子查詢
(3)使用分頁語句:limit start , count 或者條件 where子句時,有什么可限制的條件盡量加上,查一條就limit一條。做到不濫用。比如說我之前做過的的p2p項目,只是需要知道有沒有一個滿標的借款,這樣的話就可以用上 limit 1,這樣mysql在找到一條數據后就停止搜索,而不是全文搜索完再停止。
(4)開啟查詢緩存:
大多數的MySQL服務器都開啟了查詢緩存。這是提高查詢有效的方法之一。當有很多相同的查詢被執行了多次的時候,這些查詢結果會被放到一個緩存中,這樣,后續的相同的查詢就不用操作表而直接訪問緩存結果了。
查詢緩存工作流程:
A):服務器接收SQL,以SQL+DB+Query_cache_query_flags作為hash查找鍵;
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
相關參數及命令:
與緩存相關的主要參數如下表所示??梢允褂妹頢HOW VARIABLES LIKE '%query_cache%'查看
緩存數據失效時機
在表的結構或數據發生改變時,查詢緩存中的數據不再有效。有這些INSERT、UPDATE、 DELETE、TRUNCATE、ALTER TABLE、DROP TABLE或DROP DATABASE會導致緩存數據失效。所以查詢緩存適合有大量相同查詢的應用,不適合有大量數據更新的應用。
可以使用下面三個SQL來清理查詢緩存:
1、FLUSH QUERY CACHE; // 清理查詢緩存內存碎片。
2、RESET QUERY CACHE; // 從查詢緩存中移出所有查詢。
3、FLUSH TABLES; //關閉所有打開的表,同時該操作將會清空查詢緩存中的內容。
InnoDB與查詢緩存:
Innodb會對每個表設置一個事務計數器,里面存儲當前最大的事務ID.當一個事務提交時,InnoDB會使用MVCC中系統事務ID最大的事務ID跟新當前表的計數器.
只有比這個最大ID大的事務能使用查詢緩存,其他比這個ID小的事務則不能使用查詢緩存.
另外,在InnoDB中,所有有加鎖操作的事務都不使用任何查詢緩存
本篇基于單表查詢的查詢優化(非索引設計)就說到這里,喜歡的朋友可以收藏關注一波。本號內有多個專題,如【數據結構】、【netty專題】、【dubbo專題】、【mysql優化專題】、【redis專題】、【高并發專題】等優質好文。一起學習,共同進步。