1、wait_timeout / interactive_timeout 連接超時
服務器關閉連接之前等待活動的秒數。MySQL所支持的最大連接數是有限的,因為每個連接的建立都會消耗內存,因此我們希望MySQL 處理完相應的操作後,應該斷開連接並釋放占用的內存。如果你的MySQL Server有大量的閒置連接,他們不僅會白白消耗內存,而且如果連接一直在累加而不斷開,最終肯定會達到MySQL Server的連接上限數,這會報'too many connections'的錯誤。對於wait_timeout的值設定,應該根據系統的運行情況來判斷。在系統運行一段時間後,可以通過show processlist命令查看當前系統的連接狀態,如果發現有大量的sleep狀態的連接進程,則說明該參數設置的過大,可以進行適當的調整小些。建議120 ~ 300
wait_timeout 指定一個請求的最大連接時間 wait_timeout = 10,對於4GB左右內存的服務器可以設置為5-10。
2、skip-name-resolve連接檢查
skip-name-resolve參數用於禁止DNS的反向解析。MySQL默認開啟了DNS的反向解析,當有新的連接到來時,MySQL會解析連接主機的DNS,這就影響了連接速度。使用該參數也有一個代價,就是每次連接都要使用ip地址,就不能再使用localhost,改成127.0.0.1
3、max_connections 最大連接進程數,也就是允許同時連接的客戶數量
如果服務器的並發連接請求比較大,建議調高此值,以增加並行連接數量。但連接數越大,MySQL會為每個連接提供連接緩沖區,就會開銷越多的內存,服務器消耗的內存越多,可能會影響服務器性能,所以要根據服務器的配置適當調整該值,不能盲目提高設值。默認數值是100。【計算MySQL繁忙時處理連接的情況,建議值50% ~ 80%】max_used_connections / max_connections * 100%
4、max_connect_errors 最大連接錯誤數
max_connect_errors = 10000000。對於同一主機,如果有超出該參數值個數的中斷錯誤連接,則該主機將被禁止連接。如需對該主機進行解禁,執行:FLUSH HOST;。
5、max_allowed_packet 設置最大包,限制server接受的數據包大小,避免超長SQL的執行有問題
默認值為16M,當MySQL客戶端或mysqld服務器收到大於max_allowed_packet字節的信息包時,將發出“信息包過大”錯誤,並關閉連接。對於某些客戶端,如果通信信息包過大,在執行查詢期間,可能會遇到“丟失與MySQL服務器的連接”錯誤。
增加該變量的值十分安全,這是因為僅當需要時才會分配額外內存。例如,僅當你發出長查詢或mysqld必須返回大的結果行時mysqld才會分配更多內存。該變量之所以取較小默認值是一種預防措施,以捕獲客戶端和服務器之間的錯誤信息包,並確保不會因偶然使用大的信息包而導致內存溢出。
6、thread_concurrency 允許通過的並發數 屬重點優化參數
設置thread_concurrency的值的正確與否, 對mysql的性能影響很大, 在多個cpu(或多核)的情況下,錯誤設置了thread_concurrency的值, 會導致mysql不能充分利用多cpu(或多核), 出現同一時刻只能一個cpu(或核)在工作的情況。thread_concurrency應設為CPU核數的2倍. 比如有一個雙核的CPU, 那麼thread_concurrency的應該為4; 2個雙核的cpu, thread_concurrency的值應為8。
7、back_log 設置MySQL能暫存的連接數量
當MySQL在一個很短時間內收到非常多的連接請求時起作用。如果MySQL的連接數達到max_connections時,新來的請求將會被存在堆棧中,以等待某一連接釋放資源,該堆棧的數量即back_log,如果等待連接的數量超過back_log,將不被授予連接資源。設定back_log高於你的操作系統的限制是無效的。當你觀察你的主機進程列表,發現大量 264084 | unauthenticated user | xxx.xxx.xxx.xxx | NULL | Connect | NULL | login | NULL 的待連接進程時,就要加大 back_log 的值了。默認數值是50,如果訪問量大可以它改為500。默認數值是50。
我列舉幾個我熟悉的,
1,存儲引擎,根據應用選擇合適的引擎
2,索引 ----這個就有很多文章了,具體需要你自己去了解
3,sql語句優化,查詢條件的選擇之類
4,mysql自身系統配置,需要針對應用去定制
5,表的選擇,臨時表,或者分區表,也需要針對應用的情況去選擇使用
1、選取最適用的字段屬性,盡可能減少定義字段長度,盡量把字段設置NOT NULL,例如'省份,性別',最好設置為ENUM
2、使用連接(JOIN)來代替子查詢:
a.刪除沒有任何訂單客戶:DELETE FROM customerinfo WHERE customerid NOT in(SELECT customerid FROM orderinfo)
b.提取所有沒有訂單客戶:SELECT FROM customerinfo WHERE customerid NOT in(SELECT customerid FROM orderinfo)
c.提高b的速度優化:SELECT FROM customerinfo LEFT JOIN orderid customerinfo.customerid=orderinfo.customerid
WHERE orderinfo.customerid IS NULL
3、使用聯合(UNION)來代替手動創建的臨時表
a.創建臨時表:SELECT name FROM `nametest` UNION SELECT username FROM `nametest2`
4、事務處理:
a.保證數據完整性,例如添加和修改同時,兩者成立則都執行,一者失敗都失敗
mysql_query("BEGIN");
mysql_query("INSERT INTO customerinfo (name) VALUES ('$name1')";
mysql_query("SELECT * FROM `orderinfo` where customerid=".$id");
mysql_query("COMMIT");
5、鎖定表,優化事務處理:
a.我們用一個 SELECT 語句取出初始數據,通過一些計算,用 UPDATE 語句將新值更新到表中。
包含有 WRITE 關鍵字的 LOCK TABLE 語句可以保證在 UNLOCK TABLES 命令被執行之前,
不會有其它的訪問來對 inventory 進行插入、更新或者刪除的操作
mysql_query("LOCK TABLE customerinfo READ, orderinfo WRITE");
mysql_query("SELECT customerid FROM `customerinfo` where id=".$id);
mysql_query("UPDATE `orderinfo` SET ordertitle='$title' where customerid=".$id);
mysql_query("UNLOCK TABLES");
6、使用外鍵,優化鎖定表
a.把customerinfo裡的customerid映射到orderinfo裡的customerid,
任何一條沒有合法的customerid的記錄不會寫到orderinfo裡
CREATE TABLE customerinfo
(
customerid INT NOT NULL,
PRIMARY KEY(customerid)
......余下全文>>