談談mysql數據庫優化有那些方面

Mysql數據庫具體優化包括:配置文件的優化、sql語句的優化、表結構的優化、索引的優化,而配置的優化包括:系統內核優化、硬件資源、內存、CPU、mysql本身配置文件的優化。

硬件上的優化:增加內存和提高磁盤讀寫速度,都可以提高MySQL數據庫的查詢,更新的速度。另一種提高MySQL性能的方式是使用多塊磁盤來存儲數據。因為可以從多塊磁盤上並行讀取數據,這樣可以提高讀取數據的速度。

MySQL參數的優化:內存中會為MySQL保留部分的緩衝區,這些緩衝區可以提高MySQL的速度,緩衝區的大小可以在MySQL的配置文件中進行設置。

[client]
#[client]和[mysql]都是客戶端

port = 3306
#port參數表示的是MySQL數據庫的端口,默認的端口是3306
socket = /tmp/mysql.sock
#客戶端連接本地mysql時使用sock文件,通信文件

[mysqld]
#主配置

user = mysql
#運行時用戶

server_id = 10
#主從區分ID
port = 3306
#守護進程監聽端口

socket = /tmp/mysql.sock
#本地mysql.sock文件

datadir = /data/mysql/
mysql數據目錄

old_passwords = 1
#當服務器生成長密碼哈希值時,允許你維持同4.1之前的客戶端的向後兼容性。

lower_case_table_names = 1
#lower_case_table_names = 1 表名存儲在磁盤是小寫的,但是比較的時候是不區分大小寫

#lower_case_table_names=0 表名存儲為給定的大小和比較是區分大小寫的

#lower_case_table_names=2, 表名存儲為給定的大小寫但是比較的時候是小寫的

character-set-server = utf8
#服務器字符集,默認情況下所採用的。

default-storage-engine = INNODB
#默認mysql引擎

default_tmp_storage_engine
#表示臨時表的默認存儲引擎。

log-bin = bin.log
#開啟binlog日誌

log-error = error.log
#開啟錯誤日誌

pid-file = mysql.pid
#記錄的是當前 mysqld 進程的 pid,pid 亦即 Process ID。

long_query_time = 2
#慢查詢超時時間,默認為10s,MYSQL5.5以上可以設置微秒;

slow_query_log


#關閉慢查詢日誌

slow_query_log_file = slow.log
#慢查詢日誌文件

binlog_cache_size = 4M
#服務器配置了 log-bin,為每個session 分配的內存,在事務過程中用來存儲二進制日誌的緩存。

binlog_format = mixed
#二進制日誌 (binlog) 有 3 種不同的格式可選:Mixed,Statement,Row
max_binlog_cache_size = 16M
#表示的是binlog 能夠使用的最大cache 內存大小

max_binlog_size = 1G
#如果二進制日誌寫入的內容超出給定值,日誌就會發生滾動。你不能將該變量設置為大於1GB或小於4096字節。 默認值是1GB。

expire_logs_days = 30
#主要用來控制binlog日誌文件保留時間,超過保留時間的binlog日誌會被自動刪除。單位是天

ft_min_word_len = 1
#設置mysql最小索引長度是4
back_log = 512
#在MySQL暫時停止回答新請求之前的短時間內多少個請求可以被存在堆棧中。

max_allowed_packet = 64M
# 值設置過小將導致單個記錄超過限制後寫入數據庫失敗,且後續記錄寫入也將失敗,為了數據完整性,需要考慮到事務因素。

max_connections = 4096
#mysql的最大連接數

max_connect_errors = 100
#一個MySQL中與安全有關的計數器值,它負責阻止過多嘗試失敗的客戶端以防止暴力破解密碼的情況。max_connect_errors的值與性能並無太大關係。

join_buffer_size = 2M
# 聯合查詢操作所能使用的緩衝區大小,和sort_buffer_size一樣,該參數對應的分配內存也是每連接獨享

read_buffer_size = 2M
# MySQL讀入緩衝區大小。對錶進行順序掃描的請求將分配一個讀入緩衝區,MySQL會為它分配一段內存緩衝區。read_buffer_size變量控制這一緩衝區的大小。

read_rnd_buffer_size = 2M
# MySQL的隨機讀緩衝區大小。當按任意順序讀取行時(例如,按照排序順序),將分配一個隨機讀緩存區。進行排序查詢時,

sort_buffer_size = 2M
# MySQL執行排序使用的緩衝大小。如果想要增加ORDER BY的速度,首先看是否可以讓MySQL使用索引而不是額外的排序階段。

query_cache_size = 64M
#(查詢緩存)是一個眾所周知的瓶頸,甚至在併發並不多的時候也是如此。

table_open_cache = 10000
# open_tables 表示打開表的數量,opened_tables表示打開過的表數量,如果opened_tables數量過大,說明配置中 table_cache(5.1.3之後這個值叫做table_open_cache)值可能太小

thread_cache_size = 256
#當客戶端斷開之後,服務器處理此客戶的線程將會緩存起來以響應下一個客戶而不是銷燬(前提是緩存數未達上限)。Threads_created表示創建過的線程數:

max_heap_table_size = 64M
#為了防止意外創建一個超大的內存表導致永盡所有的內存資源.
tmp_table_size = 64M
# #臨時HEAP數據表的最大長度

thread_stack = 192K
#每個連接線程被創建時,MySQL給它分配的內存大小。

thread_concurrency = 24
local-infile = 0
skip-show-database
skip-name-resolve
skip-external-locking
connect_timeout = 600
interactive_timeout = 600
wait_timeout = 600
#*** MyISAM
key_buffer_size = 512M
#Key Buffer大小,用於緩存MyISAM表的索引塊。決定數據庫索引處理的速度(尤其是索引讀)(1G 內存——>256M)

bulk_insert_buffer_size = 64M
myisam_sort_buffer_size = 64M
myisam_max_sort_file_size = 1G
# mysql重建索引時允許使用的臨時文件最大大小

myisam_repair_threads = 1
concurrent_insert = 2
myisam_recover
#*** INNODB
innodb_buffer_pool_size = 64G
#動態分配資源

innodb_additional_mem_pool_size = 32M
innodb_data_file_path = ibdata1:1G;ibdata2:1G:autoextend
innodb_read_io_threads = 8
#控制後臺線程處理數據頁上的寫請求, 默認是4,不支持動態修改,建議根據服務器的核數以及讀寫請求 的比例加以調整。

innodb_write_io_threads = 8
#該參數值之和=2*cpu個數*cpu核數;如果你的系統讀>寫,可以設置innodb_read_io_threads值相對大點;反之,也可以.
innodb_file_per_table = 1
innodb_flush_log_at_trx_commit = 2
#如果是遊戲服務器,建議此值設置為2;如果是對數據安全要求極高的應用,建議設置為1;設置為0性能最高,但如果發生故障,數據可能會有丟失的危險! 默認值1的意思是每一次事務提交或事務外的指令都需要把日誌寫入(flush)硬盤,這是很費時的。特別是使用電池供電緩存 (Battery backed up cache)時。設成2對於很多運用,特別是從MyISAM錶轉過來的是可以的,它的意思是不寫入硬盤而是寫入系 統緩存。日誌仍然會每秒flush到硬盤,所以你一般不會丟失超過1-2秒的更新。設成0會更快一點,但安全方面比較差,即使MySQL掛了也可能會丟失 事務的數據。而值2只會在整個操作系統掛了時才可能丟數據。

innodb_lock_wait_timeout = 120
#是innodb等待行鎖直到放棄的秒數

innodb_log_buffer_size = 8M
#這個參數就是用來設置 Innodb 的 Log Buffer 大小的,系統默認值為 1MB。Log Buffer 的主要作用就是緩衝 Log 數據,提高寫 Log 的 IO 性能。一般來說,如果你的系統不是寫負載非常高且以 大事務居多的話,8MB 以內的大小就完全足夠了。

innodb_log_file_size = 256M
#在一個日誌組中每一個日誌文件大小。日誌文件合併後的大小((innodb_log_file_size *innodb_log_files_in_group)可以到達512G。默認是48M。值明智範圍從1MB到緩衝池的大小的1/n,N是日誌文件組中文件數。值越大,在緩衝池執行checkpoint 刷新活動次數越小,節省磁盤I/O。

innodb_log_files_in_group = 3
# #在日誌組的日誌文件數。

innodb_max_dirty_pages_pct = 90
#關閉數據庫之前,可以手工調整@@global.innodb_max_dirty_pages_pct為比較小的數值,然後等待dity pages變少,然後restart,可以減少啟動要恢復的時間。

innodb_thread_concurrency = 16
#線程已滿時,Slave 端複製線程的延遲時間(ms), 默認為0, 不延遲,可動態修改。

innodb_open_files = 10000
#innodb_force_recovery = 4
#*** Replication Slave
read-only
#1是隻讀,0是讀寫, mysql設置為只讀後,無法增刪改。

#skip-slave-start
#slave複製進程不隨mysql啟動而啟動

relay-log = relay.log
中繼日誌,就像二進制日誌一樣,由一組編號的文件組成,其中包含描述數據庫更改的事件,以及包含所有使用的中繼日誌文件名稱的索引文件。

log-slave-updates
#該參數就是為了讓從庫從主庫複製數據時可以寫入到binlog日誌

#是一個全局非動態選項,其值為布爾型,即TRUE和FALSE。缺省為FALSE,修改該參數需要重啟實例。

#從庫開啟log-bin參數,如果直接往從庫寫數據,是可以記錄log-bin日誌的,但是從庫通過I0線程讀取主庫二進制日誌文件,然後通過SQL線程寫入的數據,是不會記錄binlog日誌的。也就是說從庫從主庫上覆制的數據,是不寫入從庫的binlog日誌的。所以從庫做為其他從庫的主庫時需要在配置文件中添加log-slave-updates參數。


分享到:


相關文章: