數據庫結構優化
表的水平拆分
常用的水平拆分方法為:
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優化