Mysql數據庫操作系統及配置參數優化


  • 數據庫結構優化

    表的水平拆分
    常用的水平拆分方法為:
    1.對 customer_id進行 hash運算,如果要拆分成5個表 則使用mod(customer_id,5)取出0-4個值
    2.針對不同的 hashID 把數據存到不同的表中。
    挑戰:
    1.跨分區表進行數據查詢
    2.統計及后台報表操作

  • 操作系統配置優化

    數據庫是基於操作系統的,目前大多數MySQL都是安裝在Linux系統之上,所以對於操作系統的一些參數配置也會影響到MySQL的性能,下面就列出一些常到的系統配置。
    網給方面的配置, 要修改/etc/sysctl.conf文件
    增加tcp支持的隊列數
    net.ipv4.tcp_max_syn_backlog = 65535
    減少斷開連接時 ,資源回收
    net.ipv4.tcp_max_tw_buckets = 8000
    net.ipv4.tcp_tw_reuse = 1
    net.ipv4.tcp_tw_recycle = 1
    net.ipv4.tcp_fin_timeout = 10

  • 打開文件的限制
    可以便用ulimit -a目錄的芻各位限制,可以修改/etc/security/limits.conf文件 增加以下內容以修改打開文件數量的限制
    *soft nofile 65535
    *hard nofile 65535
    除此之外最好在MySQL服務器上關閉iptables,selinux 等防火牆軟件。

  • MySQL配置文件

    Linux系統中MySQl配置文件一般位於/etc/my.cnf
    MySQL配置文件一常用參數說明
    innodb_buffer_pool_size
    非常重要的一個參數 ,用於配置Innodb的緩沖池,如果數據庫中只有Innodb表,
    則推薦配置量為總內存的75%(這個前提是這個服務器只用做Mysql數據庫服務器).
    SELECT ENGINE,
    ROUND(SUM(data_length + index_length)/1024/1024,1) AS 'Total MB",FROM INFORMATION_SCHEMA.TABLES WHERE table_schema not in
    ("information_schema", "performance schema")
    GROUP BY ENGINE;
    Innodb_buffer_pool_size>=Total MB
    innodb_buffer_pool_instances
    MySQL5.5中新增參數,可以控制緩沖池的個數,默認情況下只有一個緩沖池。
    innodb_log_buffer_size
    innodb log緩沖的大小,由於日志最長每秒鍾就會刷新所以一般不用太大。
    innodb_flush_log_at_trx_commit
    關鍵參數,對innodb的IO影響很大。默認值為1,可以取0,1,2三個值,一般建議設為2,但如果數據安全性要求比較高則使用默認值1.
    innodb_read_io_threads
    innodb_write_io_threads
    以上兩個參數決定了Innodb讀寫的IO進程數,默認為4.
    innodb_file_per_table
    關鍵參數控制Innodb每一個表使用獨立的表空間,默認是OFF,也就是所有表都會建立在共享表空間里,建議為ON.
    innodb_stats_on_metadata
    決定了MySQL在什么情況下會刷新innodb表的統計信息。
    max_connections
    很多開發人員都會遇見”MySQL: ERROR 1040: Too many connections”的異常情況,造成這種情況的一種原因是訪問量過高,MySQL服務器抗不住,這個時候就要考慮增加從服務器分散讀壓力;另一種原因就是MySQL配置文件中max_connections值過小。
    首先,我們來查看mysql的最大連接數:
    mysql> show variables like '%max_connections%';
    +-----------------+-------+
    | Variable_name | Value |
    +-----------------+-------+
    | max_connections | 151 |
    +-----------------+-------+
    1 row in set (0.00 sec)

其次,查看服務器響應的最大連接數:
mysql> show global status like 'Max_used_connections';
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| Max_used_connections | 2 |
+----------------------+-------+
1 row in set (0.00 sec)

可以看到服務器響應的最大連接數為2,遠遠低於mysql服務器允許的最大連接數值。
對於mysql服務器最大連接數值的設置范圍比較理想的是:服務器響應的最大連接數值占服務器上限連接數值的比例值在10%以上,如果在10%以下,說明mysql服務器最大連接上限值設置過高。
Max_used_connections / max_connections 100% = 2/151 100% ≈ 1%

我們可以看到占比遠低於10%(因為這是本地測試服務器,結果值沒有太大的參考意義,大家可以根據實際情況設置連接數的上限值)。
再來看一下自己 linode VPS 現在(時間:2013-11-13 23:40:11)的結果值:
mysql> show variables like '%max_connections%';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 151 |
+-----------------+-------+
1 row in set (0.19 sec)
mysql> show global status like 'Max_used_connections';
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| Max_used_connections | 44 |
+----------------------+-------+
1 row in set (0.17 sec)

這里的最大連接數占上限連接數的30%左右。
上面我們知道怎么查看mysql服務器的最大連接數值,並且知道了如何判斷該值是否合理,下面我們就來介紹一下如何設置這個最大連接數值。
方法1:
mysql> set GLOBAL max_connections=256;
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like '%max_connections%';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 256 |
+-----------------+-------+
1 row in set (0.00 sec)

方法2:
修改mysql配置文件my.cnf,在[mysqld]段中添加或修改max_connections值:
max_connections=128
重啟mysql服務即可。

參考:
mysql優化連接數防止訪問量過高的方法
性能優化之MySQL優化






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM