一.概述
前面章節介紹了很多資料庫的最佳化措施,但在實際生產環境中,由於資料庫伺服器本身的效能局限,就必須要對前台的應用來進行最佳化,使得前台訪問資料庫的壓力能夠減到最小。
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 數量。 |
(查詢快取章節未完...)