mysql 開發進階篇系列 23 應用層優化與查詢緩存
一.概述
前面章節介紹了很多數據庫的優化措施,但在實際生產環境中,由於數據庫服務器本身的性能局限,就必須要對前臺的應用來進行優化,使得前臺訪問數據庫的壓力能夠減到最小。
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 應用層優化與查詢緩存