MYSQL性能調優概述

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——包服務所能處理的請求包的最大大小以及服務所能處理的最大的請求大小。
   
        
6,查詢優化,
        a>建表時表結構要合理,每個表不宜過大;在任何情況下均應使用最精確的類型。例如,如果ID列用Int是一個好主意,而用text類型則是個蠢辦法;TIME列酌情使用DATE或者DATETIME。
        b>索引,所有的查詢都走科學的索引,單個索引命中率低時使用聯合索引;
        c>查詢時儘量減少邏輯運算(與運算、或運算、大於小於某值的運算);
        d>減少不當的查詢語句,不要查詢應用中不需要的列,比如說select * from 等操作。
        e>減小事務包的大小;
        f>將多個小的查詢適當合併成一個大的查詢,減少每次建立/關閉查詢時的開銷;
        g>將某些過於複雜的查詢拆解成多個小查詢,和上一條恰好相反
        h>建立和優化存儲過程來代替大量的外部程序交互。
    
        
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觀察創建索引後的效果。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章