1,硬體最佳化
a>記憶體??大記憶體、大記憶體位寬,盡量不要用SWAP;
b>硬碟??15000RPM、RAID5、raid10
c>CPU??64位、高主頻、高緩衝,高平行處理能力
d>網路??標配的千兆網卡足矣,儘可能在同一區域網路內,盡量避免諸如防火牆策略等不必要的開銷
2,架構上的最佳化
a>縱向拆解
最簡單的一台服務同時負責web、中介軟體、資料庫多個角色;縱向拆解後就是資料庫伺服器專機專用,避免額外的服務可能導致的效能下降和不穩定性;如果將資料庫伺服器專機專用仍然無法滿足需求,可以考慮在資料庫和應用伺服器之間加Memcached。
b>橫向拆解
主從同步、負載平衡、高可用性設定組群,當單個mysql資料庫無法滿足日益增加的需求時,可以考慮在資料庫這個邏輯層面增加多台伺服器,以達到穩定、高效的效果。
http://bbs.linuxtone.org/thread-5152-1-1.html
3,作業系統層級的最佳化
a>64位系統可以分給單個進程更多的記憶體、服務調優,禁用不必要啟動的服務,修改檔案描述符限制,留更多的資源給mysql;
b>檔案系統調優,給資料倉儲一個單獨的檔案系統,推薦使用XFS,一般效率更高、更可靠。
c>可以考慮在掛載分區時啟用noatime選項。
4,資料庫服務的最佳化
a>使用linux/bsd作業系統進行編譯安裝,對編譯參數進行效能最佳化,精簡不必要啟用的功能
b>合適的應用程式介面。
c>保持每個表都不要太大,可以對大表做橫切和縱切;比如說我要取得某ID的lastlogin,完全可以做一張只有“ID”和“lastlog”的小表,而非幾十、幾百列資料的並排大表;另外對一個有1000萬條記錄的表做更新比對10個100萬記錄的表做更新一般來的要慢
d>myisam引擎,表級鎖,單鎖開銷小,但影響範圍大,適合讀多寫少的表,不支援事物日誌;表鎖定不存在死結
e>innodb引擎,行級鎖,鎖定行的開銷要比鎖定全表要大,但影響範圍小,適合寫操作比較頻繁的資料表;行級鎖可能存在死結。
5,my.cnf內參數的最佳化;
最佳化總原則:給mysql的資源太少,則mysql施展不開;給mysql的資源太多,可能會拖累整個OS。
a>總體資源佔用的最佳化;
open_files_limit??mysqld可以開啟的檔案的數量;
max_connections??允許的並行用戶端串連數目;
max_connect_errors??允許的主機的錯誤串連數;
table_cache??每個連結允許開啟的表的數量;
max_allowed_packet??從伺服器接收的包的大小;
thread_cache_size??緩衝多少個待用線程;
b>具體buffer的最佳化
sort_buffer_size??每個線程可以分配的緩衝區的大小;
join_buffer_size??不走索引的join操作可分配的緩衝區的大小;
query_cache_size??為查詢分配的緩衝;
query_cache_limit??不緩衝大於該限制的查詢結果;
query_cache_min_res_unit??不緩衝小於該限制的查詢結果;
tmp_table_size??記憶體內的暫存資料表表超過該限制值,則寫入硬碟;
binlog_cache_size??二進位記錄檔的緩衝大小;
key_buffer_size??myisam引擎的索引塊共用緩衝區;
read_buffer_size??為從資料表順序讀取資料的讀操作保留的緩衝區的長度;
innodb_additional_mem_pool_size??InnoDB用來儲存資料目錄資訊&其它內部資料結構的記憶體池的大小。你應用程式裡的表越多,你需要在這裡分配越多的記憶體。
innodb_buffer_pool_size??InnoDB用來緩衝它的資料和索引的記憶體緩衝區的大小。理論上來說是越大越好,但要注意不要設定過大,否則,由於實體記憶體的競爭可能導致作業系統的換頁顛簸.
innodb_data_file_path??innodb資料表空間的指定以及大小,初始資料表空間大一些可以減少日後自增加資料表空間的系統開銷。
innodb_thread_concurrency??在InnoDb核心內的允許線程數量;
innodb_log_buffer_size??InnoDB用來往磁碟上的記錄檔寫操作的緩衝區的大小。當日誌大小超過該限定時,日誌會被寫入磁碟,比寫入記憶體的I/O開銷大。
innodb_log_file_size??每個記錄檔的大小。
max_allowed_packet??包服務所能處理的請求包的最大大小以及服務所能處理的最大的請求大小。
http://bbs.linuxtone.org/thread-5152-1-1.html
6,查詢最佳化,
a>建表時表結構要合理,每個表不宜過大;在任何情況下均應使用最精確的類型。例如,如果ID列用Int是一個好主意,而用text類型則是個蠢辦法;TIME列酌情使用DATE或者DATETIME。
b>索引,所有的查詢都走科學的索引,單個索引命中率低時使用聯合索引;
c>查詢時盡量減少邏輯運算(與運算、或運算、大於小於某值的運算);
d>減少不當的查詢語句,不要查詢應用中不需要的列,比如說select * from 等操作。
e>減小事務包的大小;
f>將多個小的查詢適當合并成一個大的查詢,減少每次建立/關閉查詢時的開銷;
g>將某些過於複雜的查詢拆解成多個小查詢,和上一條恰好相反
h>建立和最佳化預存程序來代替大量的外部程式互動。
http://bbs.linuxtone.org/thread-5152-1-1.html
7,DEBUG工具:
a>vmstat??vmstat 命令報告關於核心線程、虛擬記憶體、磁碟、陷阱和 CPU 活動的統計資訊,
b>iostat??iostat命令報告CPU、硬碟等裝置的輸入輸出情況,可能需要安裝sysstat rpm包
c>top??動態顯示當前系統的資源佔用,和上文面的兩個命令相比,top更側重於進程。
d>free??顯示記憶體和swap佔用情況。
e>show processlist??顯示當前運行或等待的線程,判斷哪些查詢語句總是處於等待狀態
f>EXPLAIN??“EXPLAIN + SQL語句”查看索引使用方式。
g>show create table + “table_name” ??查看指定表的表結構
h> select count(distinct “row_name”) from "table_name";查看列內資料的唯一性,確定給哪一列建立索引。
i>create index 建立索引,並用 show processlist、top觀察建立索引後的效果。