隨著專案中資料庫的規模越來越大,資料量上公升到千萬級別,發現專案中資料庫 的查詢效率變得極低,後面通過修改mysql伺服器的引數配置,發現查詢效率有顯著提公升。
我所用的伺服器記憶體是128g,內含31個單核cpu。我在/etc/my.cnf檔案(linux系統的mysql配置檔案路徑)中,修改了一些配置引數,具體設定值及解釋如下:(這裡關於這些值的理解我也參考很多資料查出來的,也許理解的並不到位,望指正)
[mysqld]
innodb_buffer_pool_size = 50g
(innodb_buffer_pool_size 是安裝完innodb後第乙個應該設定的選項。
緩衝池是資料和索引快取的地方:這個值越大越好,這能保證你在大多數的讀取操作時使用的是記憶體而不是硬碟。
典型的值是5-6gb(8gb記憶體),20-25gb(32gb記憶體),100-120gb(128gb記憶體)。我們這裡採用50g足夠了。)
innodb_additional_mem_pool_size = 20g
innodb_log_buffer_size = 8m
(innodb_log_buffer_size 這項配置決定了為尚未執行的事務分配的快取。其預設值(1mb)一般來說已經夠用了,
但是如果事務中包含有二進位製大物件或者大文字字段的話,這點快取很快就會被填滿並觸發額外的i/o操作,我們這裡採用8m)
innodb_log_file_size = 5m
(innodb_log_file_size 是redo日誌的大小。redo日誌被用於確保寫操作快速而可靠並且在崩潰時恢復,總尺寸被限定在4gb。
但是我這裡只要設定超過5m時,執行查詢就會報找不到innodb的錯誤,因此這裡設定為5m)
max_allowed_packet = 4g
(限制server接受的資料報大小)
max_length_for_sort_data = 10m
(mysql有兩種檔案排序演算法(雙路排序和單路排序),如果需要排序的列的總大小加上order by列的大小超過了 max_length_for_sort_data定義的位元組,mysql就會使用雙路排序。
mysql並不會真正的顯示使用的是哪種演算法,如果增大了max_length_for_sort_data的值,並且磁碟使用率上公升,cpu使用率下降,
sort_merge_passes的值比以前增加的更快,也許該強制排序使用單路排序演算法。)
table_open_cache = 256
(table_cache是乙個非常重要的mysql效能引數,它在5.1.3之後的版本中叫做table_open_cache。
table_cache主要用於設定table快取記憶體的數量。由於每個客戶端連線都會至少訪問乙個表,因此此引數的值與max_connections有關。
當某一連線訪問乙個表時,mysql會檢查當前已快取表的數量。如果該錶已經在快取中開啟,則會直接訪問快取中的表已加快查詢速度;
如果該錶未被快取,則會將當前的表新增進快取並進行查詢。
在執行快取操作之前,table_cache用於限制快取表的最大數目:
如果當前已經快取的表未達到table_cache,則會將新錶新增進來;
若已經達到此值,mysql將根據快取表的最後查詢時間、查詢率等規則釋放之前的快取。
該值並非設定越大越好,我嘗試著設為1024,發現查詢的效率不增反降。)
tmp_table_size = 512m
(通過設定tmp_table_size選項來增加一張臨時表的大小,例如做高階group by操作生成的臨時表。
如果調高該值,mysql同時將增加heap表的大小,可達到提高聯接查詢速度的效果。
建議盡量優化查詢,要確保查詢過程中生成的臨時表在記憶體中,避免臨時表過大導致生成基於硬碟的myisam表。)
sort_buffer_size = 8m
(需要排序會話的快取大小,是針對每乙個連線connection的,這個值也不會越大越好,預設大小是256kb,過大的配置會消耗更多的記憶體。如果有100個連線,就會占用800m快取。)
read_buffer_size = 8m
(mysql的隨機讀(查詢操作)緩衝區大小,也是針對每乙個連線connection的。當按任意順序讀取行時(例如,按照排序順序),將分配乙個隨機讀快取區。
進行排序查詢時,mysql會首先掃瞄一遍該緩衝,以避免磁碟搜尋,提高查詢速度,如果需要排序大量資料,可適當調高該值。
但mysql會為每個客戶連線發放該緩衝空間,所以應盡量適當設定該值,以避免記憶體開銷過大)
read_rnd_buffer_size = 8m
(批量插入資料快取大小,可以有效提高插入效率,預設為8m)
thread_cache_size = 1m
(伺服器執行緒快取這個值表示可以重新利用儲存在快取中線程的數量,
當斷開連線時如果快取中還有空間,那麼客戶端的執行緒將被放到快取中,如果執行緒重新被請求,那麼請求將從快取中讀取,
如果快取中是空的或者是新的請求,那麼這個執行緒將被重新建立,如果有很多新的執行緒,增加這個值可以改善系統效能.
通過比較 connections 和 threads_created 狀態的變數,可以看到這個變數的作用)
query_cache_size= 512m
(查詢快取)
query_cache_limit = 40m
thread_concurrency = 62
(設定thread_concurrency的值的正確與否, 對mysql的效能影響很大,
在多個cpu(或多核)的情況下,錯誤設定了thread_concurrency的值, 會導致mysql不能充分利用多cpu(或多核), 出現同一時刻只能乙個cpu(或核)在工作的情況。
thread_concurrency應設為cpu核數的2倍. 比如有乙個雙核的cpu, 那麼thread_concurrency的應該為4; 2個雙核的cpu, thread_concurrency的值應為8
我這裡伺服器cpu是31個,因此將值設為62)
[mysqldump]
max_allowed_packet = 4g
(限制server接受的資料報大小)
[myisamchk]
key_buffer_size = 6g
(key_buffer_size 是myisam儲存引擎用來設定索引塊(index blocks)快取的大小,它被所有執行緒共享,
嚴格說是它決定了資料庫索引處理的速度,尤其是索引讀的速度)
sort_buffer_size = 8m
read_buffer = 8m
write_buffer = 200m
MySQL系統變數
set global session 系統變數名 值 set global default storage engine myisam set session default storage engine myisam 如果在設定系統變數的時候省略了作用範圍,預設的作用範圍就是session sho...
Linux系統相關配置
修改主機名 centos5 6 1 etc sysconfig network 2 修改hosts檔案 etc hosts centos7 1 etc hostname,或者hostnamectl set hostname newhostname 2 修改host檔案 將網絡卡改為預設開機自動啟動 ...
alpine系統相關配置
cat etc network inte ces auto lo iface lo inet loopback auto eth0 iface eth0 inet static address 10.0.0.130 netmask 255.255.255.0 gateway 10.0.0.254ca...