1. 程式人生 > >mysql 開發進階篇系列 23 應用層優化與查詢緩存

mysql 開發進階篇系列 23 應用層優化與查詢緩存

http lang 單位 tro source 局限 pooling 內存不足 unit

一.概述    

  前面章節介紹了很多數據庫的優化措施,但在實際生產環境中,由於數據庫服務器本身的性能局限,就必須要對前臺的應用來進行優化,使得前臺訪問數據庫的壓力能夠減到最小。
  1. 使用連接池
  對於訪問數據庫來說,建立連接的代價比較昂貴,因為連接到數據庫服務器需要經歷多個步驟如:建立物理通道,服務器進行初次握手,分析連接字符串信息,由服務器對連接進行身份驗證等。因此,有必要建立"連接池"以提高訪問的性能。連接池中的連接已經預先創建好了,可以直接分配給應用層使用,減少了創建新連接所消耗的資源,連接返回後,本次訪問將連接交還給"連接池",以供新的訪問使用。

(1)如果池中有空閑連接可用,返回該連接。
(2)如果池中連接都已用完,創建一個新連接添加到池中。
(3)如果池中連接已達到最大連接數,請求進入等待隊列直到有空閑連接可用。

//下面以ado.net 連接數據庫為例:
             //引用 System.Data.SqlClient
            //可以使用字符串connectionString來實例化SqlConnection對象
            string connectionString ="Integrated Security=False;server={0};database={1};User ID={2};Password={3};Max Pool Size=512;Connect Timeout=30";
            
            //也可以使用SqlConnectionStringBuilder類來實例化SqlConnection對象
SqlConnectionStringBuilder sqlconnStringBuilder = new SqlConnectionStringBuilder(); //連接池是否默認打開 默認為true sqlconnStringBuilder.Pooling = true; //連接池中最大連接數 sqlconnStringBuilder.MaxPoolSize = 512; //連接請求等待超時時間。默認為15秒,單位為秒。 sqlconnStringBuilder.ConnectTimeout = 30
; sqlconnStringBuilder.DataSource = ""; sqlconnStringBuilder.UserID = ""; sqlconnStringBuilder.Password = ""; //使用用戶名和密碼連接 sqlconnStringBuilder.IntegratedSecurity = false; SqlConnection sql = new SqlConnection(connectionString); //or sql = new SqlConnection(sqlconnStringBuilder.ConnectionString); //用完後記得關閉當前連接 sql.Close(); //使用mysql一樣 引用MySql.Data.dll MySql.Data.MySqlClient.MySqlConnection mysqlconn = new MySql.Data.MySqlClient.MySqlConnection(); MySql.Data.MySqlClient.MySqlConnectionStringBuilder mysqlconnStringBuilder = new MySql.Data.MySqlClient.MySqlConnectionStringBuilder();

  2.使用查詢緩存
  mysql的查詢緩存在4.1版本以後新增的功能,它的作用是存儲select 查詢的文本以及相應結果。如果隨後收到一個相同的查詢,服務器會從查詢緩存中重新得到查詢結果,而不再需要解析和執行查詢。查詢緩存的適用對象是更新不頻繁的表,當表更改(表結構和表數據)後,查詢緩存值的相關條目被清空。

--  查詢緩存相關的參數
SHOW VARIABLES LIKE %query_cache%;

技術分享圖片

        參數解釋:

have_query_cache

表示這個mysql版本是否支持查詢緩存。

query_cache_limit

表示單個結果集所被允許緩存的最大值。

1048576.0/1024.0/1024.0=1.0M 默認1M,超過空間大小不被緩存。

query_cache_min_res_unit

每個被緩存的結果集要占用的最小內存。

query_cache_size

用於查詢緩存的內存總大小。

1048576.0/1024.0/1024.0=1.0M 默認1M,超過空間大小不被緩存。

query_cache_type

默認關閉緩存

query_cache_wlock_invalidate

控制當有寫鎖加在表上的時候,是否先讓該表相關的 Query Cache失效。

OFF: 是指在鎖定時刻仍然允許讀取該表相關的 Query Cache。

ON: 寫鎖定的同時將使該表相關的所有 Query Cache 失效。


--
監視查詢緩存的使用狀況 SHOW STATUS LIKE Qcache%

技術分享圖片

      參數解釋:

Qcache_free_memory  

查詢緩存目前剩余空間大小。

Qcache_hits     

查詢緩存的命中次數。

Qcache_inserts     

查詢緩存插入的次數

Qcache_free_blocks

目前還有多少剩余的blocks。FLUSH QUERY CACHE 會對緩存中的碎片進行整理,從而得到一個空閑塊。這個值比較大,意味著內存碎片比較多

Qcache_lowmem_prunes 多少條Query 因為內存不足而被清除出Query Cache。緩存出現內存不足並且必須要進行清理,以便為更多查詢提供空間的次數。這個數字最好長時間來看;如果這個數字在不斷增長,就表示可能碎片非常嚴重,或者內存很少

Qcache_not_cached

不能被cache 的Query 的數量。不適合進行緩存查詢的數量,通常是由於這些查詢不是 SELECT 語句

Qcache_queries_in_cache

當前Query Cache 中cache 的Query 數量.

Qcache_total_blocks

當前Query Cache 中的block 數量。

  (查詢緩存章節未完...)

mysql 開發進階篇系列 23 應用層優化與查詢緩存