## 優化服務器硬件
### 配置較大的內存
足夠大的內存,是提高MySQL數據庫性能的方法之一.內存的速度比磁盤I/O快,可以通過增加系統的緩沖區容量,使數據再內存停留的事件更長,以減少磁盤I/O
## 單機MySQL數據庫的優化
### 服務器硬件對MySQL性能的影響
#### 磁盤尋道能力 (磁盤I/O)
我們現在上的都是SAS15000轉的硬盤。MySQL每秒鐘都在進行大量、復雜的查詢操作,對磁盤的讀寫量可想而知。所以,通常認為磁 盤I/O是制約MySQL性能的最大因素之一,對于日均訪 問量在100萬PV以上的Discuz!論壇,由于磁盤I/O的制約,MySQL的性能會非常低下!解決這一制約因素可以考慮以下幾種解決方案: 使用RAID1+0磁盤陣列,注意不要嘗試使用RAID-5,MySQL在RAID-5磁盤陣列上的效率不會像你期待的那樣快。
#### CPU
對于MySQL應用,推薦使用DELL R710,E5620 @2.40GHz(4 core)* 2 ,我現在比較喜歡DELL R710,也在用其作Linuxakg 虛擬化應用;
#### 物理內存
對于一臺使用MySQL的Database Server來說,服務器內存建議不要小于2GB,推薦使用4GB以上的物理內存,不過內存對于現在的服務器而言可以說是一個可以忽略的問題,工作中遇到高端服務器基本上內存都超過了32G。我們工作中用得比較多的數據庫服務器是HP DL580G5和DELL R710,穩定性和性能都不錯;特別是DELL R710,我發現許多同行都是采用它作數據庫的服務器,所以重點推薦下。
### MySQL的線上安裝
我建議采取編譯安裝的方法,這樣性能上有較大提升,服務器系統我建議用64bit的Centos,源碼包的編譯參數會默 認以Debgu模式生成二進制代碼,而Debug模式給MySQL帶來的性能損失是比較大的,所以當我們編譯準備安裝的產品代碼時,一定不要忘記使用“— without-debug”參數禁用Debug模式。而如果把—with-mysqld-ldflags和—with-client-ldflags二 個編譯參數設置為—all-static的話,可以告訴編譯器以靜態方式編譯和編譯結果代碼得到最高的性能。使用靜態編譯和使用動態編譯的代碼相比,性能 差距可能會達到5%至10%之多。編譯參數,特列如下,供大家參考
```shell
./configure –prefix=/usr/local/mysql –without-debug –without-bench –enable-thread-safe-client –enable-assembler –enable-profiling –with-mysqld-ldflags=-all-static –with-client-ldflags=-all-static –with-charset=latin1 –with-extra-charset=utf8,gbk –with-innodb –with-csv-storage-engine –with-federated-storage-engine –with-mysqld-user=mysql –with-server-suffix=-community –with-unix-socket-path=/usr/local/mysql/sock/mysql.sock
```
### MySQL配置文件
MySQL服務配置參數在my.cnf或my.ini文件的[MySQLd]組中
|參數|說明|
|-|-|
|skip-locking|避免MySQL的外部鎖定,減少出錯幾率增強穩定性|
|skip-name-resolve|禁止MySQL對外部連接進行DNS解析,使用這一選項可以消除MySQL進行DNS解析的時間。|
|back_log|參數的值指出在MySQL暫時停止響應新請求之前的短時間內多少個請求可以被存在堆棧中。 如果系統在一個短時間內有很多連接,則需要增大該參數的值,該參數值指定到來的TCP/IP連接的偵聽隊列的大小。不同的操作系統在這個隊列大小上有它自 己的限制。 試圖設定back_log高于你的操作系統的限制將是無效的。默認值為50。對于Linux系統推薦設置為小于512的整數。|
|key_buffer_size|指定用于索引的緩沖區大小,增加它可得到更好的索引處理性能。對于內存在4GB左右的服務器該參數可設置為256M或384M。注意:該參數值設置的過大反而會是服務器整體效率降低!|
|sort_buffer_size|查詢排序時所能使用的緩沖區大小。注意:該參數對應的分配內存是每連接獨占,如果有100個連接,那么實際分配的總共排序緩沖區大小為100 × 6 = 600MB。所以,對于內存在4GB左右的服務器推薦設置為6-8M。|
|read_buffer_size|讀查詢操作所能使用的緩沖區大小。和sort_buffer_size一樣,該參數對應的分配內存也是每連接獨享。|
|join_buffer_size|聯合查詢操作所能使用的緩沖區大小,和sort_buffer_size一樣,該參數對應的分配內存也是每連接獨享。|
|query_cache_size|指定MySQL查詢緩沖區的大小。可以通過在MySQL控制臺觀察,如果Qcache_lowmem_prunes的值非常大,則表明經常出現緩沖不 夠 的情況;如果Qcache_hits的值非常大,則表明查詢緩沖使用非常頻繁,如果該值較小反而會影響效率,那么可以考慮不用查詢緩 沖;Qcache_free_blocks,如果該值非常大,則表明緩沖區中碎片很多。|
|max_connections|指定MySQL允許的最大連接進程數。如果在訪問論壇時經常出現Too Many Connections的錯誤提 示,則需要增大該參數值。|
|wait_timeout|指定一個請求的最大連接時間,對于4GB左右內存的服務器可以設置為5-10。|
|thread_concurrency |該參數取值為服務器邏輯CPU數量x2,在本例中,服務器有2顆物理CPU,而每顆物理CPU又支持H.T超線程,所以實際取值為4x2=8;這個目前也是雙四核主流服務器配置。|
|skip-networking|開啟該選項可以徹底關閉MySQL的TCP/IP連接方式,如果WEB服務器是以遠程連接的方式訪問MySQL數據庫服務器則不要開啟該選項!否則將無法正常連接!|
|table_cache|#物理內存越大,設置就越大。默認為2402,調到512-1024最佳|
|tmp_table_size|臨時表大小,默認16M,調到64M最佳|
|read_buffer_size|表示每個線程連續掃描時為掃描的每個表分配的緩沖區的大小,默認64K|
多情況需要具體情況具體分析
一、如果Key_reads太大,則應該把my.cnf中Key_buffer_size變大,保持Key_reads/Key_read_requests至少1/100以上,越小越好。
二、如果Qcache_lowmem_prunes很大,就要增加Query_cache_size的值。很多時候我們發現,通過參數設置進行性能優化所帶來的性能提升,可能并不如許多人想象的那樣產生質的飛躍,除非是之前的設置存在嚴重不合理的情況。我們 不能將性能調優完全依托于通過DBA在數據庫上線后進行的參數調整,而應該在系統設計和開發階段就盡可能減少性能問題。
## 總結
如果單MySQL的優化始終還是頂不住壓力時,這個時候我們就必須考慮MySQL的高可用架構
### MySQL Cluster
優勢:可用性非常高,性能非常好。每份數據至少可在不同主機存一份拷貝,且冗余數據拷貝實時同步。但它的維護非常復雜,存在部分Bug,目前還不適合比較核心的線上系統,所以這個我不推薦。
### DRBD磁盤網絡鏡像方案
優勢:軟件功能強大,數據可在底層快設備級別跨物理主機鏡像,且可根據性能和可靠性要求配置不同級別的同步。IO操作保持順序,可滿足數據庫對數據一致性的苛刻要求。但非分布式文件系統環境無法支持鏡像數據同時可見,性能和可靠性兩者相互矛盾,無法適用于性能和可靠性要求都比較苛刻的環境,維護成本高于 MySQL Replication。另外,DRBD也是官方推薦的可用于MySQL高可用方案之一,所以這個大家可根據實際環境來考慮是否部署。
### MySQL Replication
在實際應用場景中,MySQL Replication是使用最為廣泛的一種提高系統擴展性的設計手段。眾多的MySQL使用者通過Replication功能提升系統的擴展性后,通過 簡單的增加價格低廉的硬件設備成倍 甚至成數量級地提高了原有系統的性能,是廣大MySQL中低端使用者非常喜歡的功能之一,也是許多MySQL使用者選擇MySQL最為重要的原因。
比較常規的MySQL Replication架構也有好幾種,這里分別簡單說明下
MySQL Replication架構一:常規復制架構--Master-slaves,是由一個Master復制到一個或多個Salve的架構模式,主要用于讀壓力大的應用數據庫端廉價擴展解決方案,讀寫分離,Master主要負責寫方面的壓力。
MySQL Replication架構二:級聯復制架構,即Master-Slaves-Slaves,這個也是為了防止Slaves的讀壓力過大,而配置一層二級 Slaves,很容易解決Master端因為附屬slave太多而成為瓶勁的風險。
MySQL Replication架構三:Dual Master與級聯復制結合架構,即Master-Master-Slaves,最大的好處是既可以避免主Master的寫操作受到Slave集群的復制帶來的影響,而且保證了主Master的單點故障。
以上就是比較常見的MySQL replication架構方案,大家可根據自己公司的具體環境來設計 ,Mysql 負載均衡可考慮用LVS或Haproxy來做,高可用HA軟件我推薦Heartbeat。
MySQL Replication的不足:如果Master主機硬件故障無法恢復,則可能造成部分未傳送到slave端的數據丟失。所以大家應該根據自己目前的網絡 規劃,選擇自己合理的Mysql架構方案,跟自己的MySQL DBA和程序員多溝涌,多備份(備份我至少會做到本地和異地雙備份),多測試,數據的事是最大的事,出不得半點差錯,切記切記。
- 簡介
- 數據庫
- 數據表
- 創建數據表
- 查看數據表結構
- 修改數據表
- 刪除數據表
- 查詢數據
- 表單查詢
- 聚合查詢
- 鏈接查詢
- 子查詢
- 聯合查詢
- 正則查詢
- 數據管理
- 數據類型
- 添加數據
- 更新數據
- 刪除數據
- 索引
- 索引分類
- 設計原則
- 添加索引
- 查看索引
- 刪除索引
- 視圖
- 視圖操作
- 視圖應用
- 事務
- 觸發器
- 存儲過程和函數
- 變量
- 異常處理
- 光標
- 流程控制
- 存儲過程
- 自定義函數
- 內置函數
- 數學
- 字符串
- 日期和時間
- 條件判斷
- 系統信息
- 加/解密
- 其他
- 用戶管理
- 登錄和退出
- 新建用戶
- 刪除用戶
- 修改用戶
- 找回ROOT密碼
- 權限管理
- 備份恢復
- 備份數據
- 恢復數據
- 日志
- 二進制日志
- 錯誤日志
- 查詢日志
- 慢查詢日志
- 性能優化
- 優化查詢語句
- 優化數據庫結構
- 優化服務器
- 主從復制
- WIN系統主從復制
- Linux單機主從復制
- Linux聯機主從復制
- 參數配置
- 日常管理和維護
- 切換主從服務器
- PHP操作
- 連接
- 創建數據庫
- 插入數據
- 插入多條數據
- 預處理語句
- 查詢數據
- 預處理語句
- 實戰應用
- 分表