1. 程式人生 > >「mysql優化專題」單表查詢優化的一些小總結,非索引設計(3)

「mysql優化專題」單表查詢優化的一些小總結,非索引設計(3)

flush src innodb atp show 優化 ase 驗證 where子句

單表查詢優化:(關於索引,後面再開單章講解)

(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

相關參數及命令:

與緩存相關的主要參數如下表所示。可以使用命令SHOW 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中,所有有加鎖操作的事務都不使用任何查詢緩存

「mysql優化專題」單表查詢優化的一些小總結,非索引設計(3)